Открытие тел: ссылки из UIWebView - PullRequest
1 голос
/ 12 ноября 2011

Я искал и искал, но не могу найти решение этой проблемы.

По какой-то причине я не могу получить ссылки 'tel:' для работы в UIWebView.При нажатии на ссылки появляется сообщение «Невозможно отобразить URL».Щелчок по той же ссылке в Safari работает отлично и набирает номер.

Эта проблема началась с iOS 5. Эти ссылки отлично работали в iOS 4.2 и 4.3.

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

Спасибо!

РЕДАКТИРОВАТЬ:

Вот фактический код используется ...

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = request.URL;    

    if ([url.scheme isEqualToString:@"tel"]) {
        return YES;
    }

    if (![url.scheme isEqualToString:@"http"] && ![url.scheme isEqualToString:@"https"]) {
        if ([[UIApplication sharedApplication] canOpenURL:url]) {
            [[UIApplication sharedApplication] openURL:url];
            return NO; // Let OS handle this url
        }
    }

    [NSThread detachNewThreadSelector:@selector(startBusy) toTarget:self withObject:nil];
    return YES;
}

Если я возьму первый оператор if, номер будет набран немедленно без подтверждения.Мне бы очень хотелось, чтобы он функционировал так, как раньше, давая предупреждение, давая вам возможность нажать «Позвонить» или «Отменить» перед набором номера.

Ответы [ 2 ]

7 голосов
/ 12 ноября 2011

При запуске в виде ссылки 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.

0 голосов
/ 12 ноября 2011

Если вы создали UIWebView в .xib, выберите UIWebView и проверьте его атрибуты в Инспекторе атрибутов. Первым заголовком должно быть «Веб-представление», и под этим оно предоставляет список флажков с пометкой «Обнаружение». Убедитесь, что «Номера телефонов» отмечены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...