在WKWebView中启动电话/电子邮件/地图链接

KINWebBrowser是iOS应用程序的开源网页浏览器模块。 我最近升级KINWebBrowser使用WKWebView开始逐步取消UIWebView。 这产生了显着的改进,但是:

问题:WKWebView不允许用户启动包含电话号码,电子邮件地址,地图等URL的链接。

如何将WKWebViewconfiguration为从显示页面以链接forms启动这些备用URL的标准iOS行为?

所有的代码都可以在这里find

有关WKWebKit的更多信息

在这里查看KINWebBrowser GitHub上的问题

我能够通过将这个函数添加到您的KINWebBrowserViewController.m中来使其适用于Google Maps链接(这似乎与target =“_ blank”有关),对于tel:scheme,

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { if(webView != self.wkWebView) { decisionHandler(WKNavigationActionPolicyAllow); return; } UIApplication *app = [UIApplication sharedApplication]; NSURL *url = navigationAction.request.URL; if (!navigationAction.targetFrame) { if ([app canOpenURL:url]) { [app openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } } if ([url.scheme isEqualToString:@"tel"]) { if ([app canOpenURL:url]) { [app openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } } decisionHandler(WKNavigationActionPolicyAllow); } 

你需要实现另一个callback来获得这个权利(Swift 3.1):

 // Gets called if webView cant handle URL func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { guard let failingUrlStr = (error as NSError).userInfo["NSErrorFailingURLStringKey"] as? String else { return } let failingUrl = URL(string: failingUrlStr)! switch failingUrl { // Needed to open Facebook case _ where failingUrlStr.startsWith("fb:"): if #available(iOS 10.0, *) { UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil) return } // Else: Do nothing, iOS 9 and earlier will handle this // Needed to open Mail-app case _ where failingUrlStr.startsWith("mailto:"): if UIApplication.shared.canOpenURL(failingUrl) { UIApplication.shared.openURL(failingUrl) return } // Needed to open Appstore-App case _ where failingUrlStr.startsWith("itmss://itunes.apple.com/"): if UIApplication.shared.canOpenURL(failingUrl) { UIApplication.shared.openURL(failingUrl) return } default: break } } 

现在,Facebook,邮件,Appstore,..直接从您的应用程序调用,而无需打开Safari

适用于xcode 8.1,Swift 2.3。

对于target =“_ blank”,电话号码(tel :)和电子邮件(mailto :)链接。

 func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) { if webView != self.webview { decisionHandler(.Allow) return } let app = UIApplication.sharedApplication() if let url = navigationAction.request.URL { // Handle target="_blank" if navigationAction.targetFrame == nil { if app.canOpenURL(url) { app.openURL(url) decisionHandler(.Cancel) return } } // Handle phone and email links if url.scheme == "tel" || url.scheme == "mailto" { if app.canOpenURL(url) { app.openURL(url) decisionHandler(.Cancel) return } } decisionHandler(.Allow) } } 

这有助于我的Xcode 8 WKWebview

 func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame == nil { let url = navigationAction.request.url if url?.description.range(of: "http://") != nil || url?.description.range(of: "https://") != nil || url?.description.range(of: "mailto:") != nil || url?.description.range(of: "tel:") != nil { UIApplication.shared.openURL(url!) } } return nil } 

编辑:

在链接中必须是属性target="_blank"

上面回答我的工作,但我需要它重写快速2.3

 if navigationAction.targetFrame == nil { let url = navigationAction.request.mainDocumentURL if url?.description.rangeOfString("mailto:")?.startIndex != nil || url?.description.rangeOfString("tel:")?.startIndex != nil { if #available(iOS 10, *) { UIApplication.sharedApplication().openURL(url!,options: [:], completionHandler: nil) } else { UIApplication.sharedApplication().openURL(url!) // deprecated } } }