Есть ли у приложений iPhone разрешение совершать звонки без участия пользователя?

9

Я только что читал о мошенничестве с пропущенным звонком, когда с пользователя взимается плата, даже если он не перезвонил. Мне пришло в голову, что вредоносное приложение для iPhone может совершать звонки на премиальные номера, чтобы обманывать пользователей из денег - действительно, похоже, это происходило в прошлом.

Согласно собственной документации Apple :

Когда пользователь нажимает на телефонную ссылку на веб-странице, iOS отображает предупреждение, спрашивающее, действительно ли пользователь хочет набрать номер телефона, и инициирует набор, если пользователь принимает. Когда пользователь открывает URL-адрес со схемой телефонной связи в собственном приложении, iOS не отображает предупреждение и начинает набор номера без дополнительной подсказки пользователю.

Мне кажется, что, по-видимому, мягкое приложение для iPhone может, скажем, подождать, пока телефон не будет оставлен на зарядке (и, следовательно, вероятно, не посещен пользователем), а затем инициировать звонок на премиум-номер, чтобы получить разработчику чистый бонус , Похоже, что в iOS нет никаких разрешений, которые я могу изменить, чтобы предотвратить такое поведение, так как это открывает приложение для телефона с URL-адресом, а не для доступа к каким-либо данным телефона.

Может ли кто-нибудь подтвердить, правильно ли мое понимание и, если да, то почему Apple не закрыла такую ​​зияющую дыру?

Cartroo
источник

Ответы:

8

Я экспериментально проверил поведение iOS, пытаясь инициировать телефонный звонок из одного из моих приложений.

Вот результаты:

  • Можно программно начать телефонный звонок без подтверждения пользователя. Я только что написал одну строку кода, которая выполняется сразу после загрузки приложения. Это означает, что если ваше приложение находится на переднем плане, оно может начать вызов в любое время, даже если пользователю не нужно никуда нажимать.
  • Я отправил в приложение тихое удаленное push-уведомление, чтобы разбудить его, если оно не запущено, и затем выполнить тот же код. Звонок не был начат; iOS не позволяет приложению инициировать телефонный звонок, если приложение работает в фоновом режиме.

Поэтому, отвечая на ваши вопросы, единственный способ начать телефонный звонок, когда пользователь не заметит это, - убедить пользователя оставить вредоносное приложение работающим на переднем плане, а затем начать телефонный звонок, поскольку iOS не разрешит эту операцию. если приложение фоновое.

В настоящее время iOS не предоставляет какого-либо механизма, блокирующего запуск телефонных звонков из определенного приложения, но это может произойти, только если приложение находится на переднем плане.

tomacco
источник
Спасибо за всестороннее расследование, блестящий ответ. Я рад слышать, что это только на переднем плане, хотя я не могу не думать, что не так уж сложно изобрести приложение, которое, вероятно, останется без присмотра, и на переднем плане - приложение камеры, делающее промежуток времени, является Хороший пример типа вещи. Я бы все же предпочел, чтобы открытие URL-адресов в других приложениях было разрешением для каждого открытого приложения - просто подтверждалось впервые для каждого внешнего приложения, а не каждый раз. Однако я согласен, что это имеет значение для UX. Я думаю, что все просто должны быть бдительными.
Cartroo
5

Я сделал тестовое приложение, чтобы проверить это. Приложение может открывать URL, например, tel://123456789только когда оно находится на переднем плане и активно. Когда я вызываю этот код даже после входа в фоновое состояние, API для открытия этого URL ничего не делал. Поэтому, чтобы ответить на ваш вопрос - приложения не смогут позвонить без вашего ведома.

Чтобы проверить эту вставку это в вашем AppDelegate:

- (void)applicationDidEnterBackground:(UIApplication *)application {
   [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://123456789"]];
}
Матеуш Шлосек
источник
Отличный ответ, спасибо за код. Если бы я мог принять оба ответа, я бы.
Cartroo
2

При попытке инициировать вызов на iOS> = 10.3 пользователю всегда будет отображаться всплывающее окно. Документы

Vaiden
источник