21

你在 html 或 UIWebView 中的回调中需要什么特殊的东西来处理带有 href 的锚标签,或者在 href 中带有 mailto 链接的锚标签有什么特别之处吗?

4

4 回答 4

63

在您的 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;
}
于 2010-04-05T23:33:56.563 回答
35

我注意到在 iPhone 模拟器中运行时,我可以单击 UIWebView 中的 HTTP 链接,它会在 Safari 中打开,但是当我单击 mailto 链接时,什么都不会发生。但是当我将应用程序部署到真实设备时,它就可以工作了。我预计原因是因为模拟器上没有邮件应用程序,但有 Safari。

于 2010-10-22T20:06:19.733 回答
2

我想指出,这可能不是最好的解决方案。

UIWebView 确实有一个名为 dataDetectorTypes 的属性-将其设置为 all 或 address 应该可以解决您的问题,而无需覆盖上述方法:

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

但请注意,这可能无法在模拟器上运行 - 我在 iPad 6.0 模拟器上进行了尝试,虽然在 iPad 设备上它的运行效果非常棒,但它无法正常运行!

于 2012-11-07T07:31:09.203 回答
2

Swift 4 的工作示例:处理 3 个案例,根据需要扩展。

  1. 邮件链接正在工作
  2. 单击了您想在 Webview 本身中打开的某些 URL
  3. 在移动 Safari 中打开所有其他 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
    }
    
于 2019-01-29T15:50:28.240 回答