mailto: ссылка в UIWebView - не работает - PullRequest
20 голосов
/ 05 апреля 2010

Есть ли что-то особенное, что вам нужно в html или Callbacks в UIWebView для обработки якорных тегов с помощью href, или есть что-то особенное в теге привязки с ссылкой mailto в href?

Ответы [ 4 ]

62 голосов
/ 06 апреля 2010

В делегате вашего UIWebView выполните:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if ([[[request URL] scheme] isEqual:@"mailto"]) {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    return YES;
}
34 голосов
/ 23 октября 2010

Я заметил, что при работе в симуляторе iPhone я мог щелкнуть ссылку HTTP в моем UIWebView, и она открывалась в Safari, но когда я щелкал ссылку mailto, ничего не происходило. Но когда я развернул приложение на реальном устройстве, это сработало. Я ожидаю, что причина в том, что на симуляторе нет почтового приложения, но есть Safari.

2 голосов
/ 07 ноября 2012

Я хотел бы отметить, что это, вероятно, не лучшее решение.

UIWebView имеет свойство с именем dataDetectorTypes - установка его на все или адрес должна решить вашу проблему без переопределения метода, упомянутого выше:

myWebView.dataDetectorTypes = UIDataDetectorTypeAll; //or UIDataDetectorTypeAddress etc..

Но учтите, что это может не сработать на симуляторе - я пробовал его на симуляторе iPad 6.0, где он не работает, хотя на устройстве iPad он работает как шарм!

1 голос
/ 29 января 2019

Рабочий пример для Swift 4: обрабатываются 3 случая, расширяйте их по мере необходимости.

  1. работает mailto-link
  2. щелкают некоторые URL, которые вы хотите открыть в самом Webview
  3. открыть все другие URL-адреса в мобильном сафари

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    
    if let url = navigationAction.request.url {
        if (url.scheme == "mailto") {
            // mailto: link is clicked
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
            return
        }
        if (url.absoluteString.contains("www.example.com/webviewURL")) {
            // Load this stuff in WebView
            decisionHandler(.allow)
            return
        } else {
            // open any other URL in mobile Safari
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
            return
        }
    }
    
    decisionHandler(.cancel)
    return
    }
    
...