UIWebView中的mailto链接-不起作用

21

在UIWebView中处理带href属性的锚点标签或带mailto链接的锚点标签,是否需要在HTML或回调函数方面做出特殊处理?

4个回答

64
在您的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;
}

1
在Swift 4中:func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { if (request.url?.scheme == "mailto") { UIApplication.shared.open(request.url).... - Prabhakar Kasi

35

我注意到在iPhone模拟器中,我可以点击UIWebView中的HTTP链接并在Safari中打开,但是当我点击mailto链接时没有任何反应。但是当我将应用程序部署到真实设备上时,它可以正常工作。我认为原因是模拟器上没有邮件应用程序,但有Safari。


3
iOS模拟器上没有邮件应用程序。糟糕!我从未想过这一点。感谢您解决我的困惑和沮丧。 - Basil Bourque

2
我想指出这可能不是最佳解决方案。
UIWebView 有一个名为 dataDetectorTypes 的属性 - 将其设置为 all 或 address 应该可以解决您的问题,无需覆盖上述提到的方法。
myWebView.dataDetectorTypes = UIDataDetectorTypeAll; //or UIDataDetectorTypeAddress etc..

但请注意,这可能在模拟器上无法正常工作 - 我尝试在iPad 6.0模拟器上测试,发现它无法工作,但在iPad设备上可以完美运行!


2

Swift 4的工作示例:

处理3种情况,如有需要可扩展。

最初的回答:

  1. mailto-link is working
  2. some URL is clicked that you want to open in Webview itself
  3. open all other URLs in mobile 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
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接