Mailto: Ссылка в UiWebView - не работает
Вопрос
Это специальное специальное, вам нужно в HTML или обратных вызовах в UIWebView, чтобы обрабатывать якорные теги с помощью href, или есть что-то особенное в анкеренном теге с ссылкой mailto в href?
Решение
В деле партии вашего 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;
}
Другие советы
Я заметил, что при запуске в симуляторе iPhone я мог бы нажать на ссылку HTTP в моем UIWebView, и он откроется в Safari, но когда я нажал на ссылку Mailto. Но когда я развернул приложение к реальному устройству, он работал. Я ожидаю, что причина в том, что на симуляторе нет почтового приложения, но есть Safari.
Я хотел отметить, что это, вероятно, не лучшее решение.
У UiWebView имеет свойство под названием DataDetEtectortyPes - установка этого на все или адрес должен решить вашу проблему без переопределения упомянутого выше способа:
myWebView.dataDetectorTypes = UIDataDetectorTypeAll; //or UIDataDetectorTypeAddress etc..
Но осознайте, что это может не работать на симуляторе - я попробовал его с симулятором iPad 6.0, где он не работает, хотя на устройстве iPad он работает как шарм!
Рабочий пример для Swift 4: 3 случая обрабатываются, расширяются по мере необходимости.
- mailto-link работает
- Кто-нибудь URL нажат, что вы хотите открыть в самом веб-просмотре
Откройте все остальные URL в мобильном Safari
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 }