При запуске в виде ссылки HTML, схема URL-адреса tel будет открыта, если они выглядят как:
<a href="tel:1-408-555-5555">1-408-555-5555</a>
Если вы запускаете из нативной строки URL-адреса (то есть вы кодировали ее в Objective-C ине обрабатывают его через WebView), строка URL должна выглядеть следующим образом:
tel:1-408-555-5555
Примечание: Это работает только с устройствами iOS, на которых установлено приложение Phone (это означает iPhone * только 1010 *).Устройства iPad и iPod Touch будут отображать предупреждающее сообщение.
Примечание 2: Убедитесь, что передаваемые вами телефонные номера не содержат пробелов или других специальных символов (таких как * и #).
Обратная связь по коду
Теперь, основываясь на вашем коде, все немного яснее.Вы комментируете, как ничего не происходит, когда вы оставляете первый оператор if
в методе shouldStartLoadWithRequest
(где вы возвращаете YES
).Это именно то поведение, которое вы должны увидеть, потому что ваше приложение не является приложением для телефона.Только приложение «Телефон» может обрабатывать схему URL tel:
.Возвращая YES
, вы сообщаете ОС, что ваше приложение будет обрабатывать телефонный звонок, но не может.Вы получаете вызов, когда это условие удаляется, потому что следующий блок, который проверяет if ([[UIApplication sharedApplication] canOpenURL:url])
, позволяет sharedApplication
(в данном случае это приложение Phone) запустить вызов.
Как все работает и что вы хотите
Операционная система не будет обрабатывать отображение диалогового окна предупреждения «Вызов / Отмена».Это зависит от вас.Он появляется в Safari, потому что метод shouldStartLoadWithRequest
приложения Safari, несомненно, отвечает схеме tel:
, показывая UIAlertView
.Ваше условие для if ([url.scheme isEqualToString:@"tel"])
должно, когда YES
, вызвать UIAlertView
с помощью кнопки Call и Cancel.При вызове вы скажете от sharedApplication
до openURL
;При отмене вы не будете выполнять вызов, и вы также захотите вернуть NO
, поэтому ваше приложение не пытается loadWithRequest
.
Самокорректирующееся редактирование
Чтобы быть честным в отношении ошибок в моем собственном мыслительном процессе, я оставляю свои ответы выше.
Я считаю, что диалоговое окно «Вызов / Отмена», по сути, является функцией ОС.Извиняюсь за неточность.
Я бы также ошибочно посмотрел на передачу вашего кода обработки URL-адресов на sharedApplication, возникающую только тогда, когда схема была http
или https
.
После еще одного взгляда на код, интересно, есть ли у вас какие-либо варианты отладки в Safari?Я считаю, что это предотвращает появление предупреждения.Кроме того - просто чтобы перепроверить очевидное - вы не пробуете это в симуляторе, правильно?Что произойдет, если вы удалите условную проверку для http
/ https
и просто воспользуетесь проверкой canOpenURL
?
Однако, кроме ошибки в моих комментариях к условному & самому диалогу, вам все равно следуетне возвращаюсь YES
.Чтобы сделать телефонный звонок, вы можете выполнить его, передав только sharedApplication:openURL
и вернув NO
, потому что ваше приложение не является приложением Телефон.Единственная причина, по которой вы хотите вернуть YES
в этом методе, заключается в том, что ваше приложение будет обрабатывать ссылку tel:
особым образом, не включая отправку ее в приложение Phone.