在WKWebView中启动电话/电子邮件/地图链接
KINWebBrowser是一款适用于iOS应用的开源Web浏览器模块。我最近升级KINWebBrowser使用WKWebView开始逐步取消UIWebView。这就产生了显著改善,但:在WKWebView中启动电话/电子邮件/地图链接
问题:WKWebView并不能使用户推出包含电话号码,电子邮件地址,地图等的URL链接
如何配置一个WKWebView启动标准iOS行为这些替代网址是否以展示页面的链接形式启动?
所有在WKWebKit
我能得到它的谷歌地图链接工作(这似乎与目标= “_blank”)和电话:方案通过将此功能添加到您的KINWebBrowserViewController.m
- (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);
}
这段代码有点冗长,并不保证会调用'decisionHandler'。 – 2014-10-22 19:16:02
好点!谢谢。这是一个深夜,来自两个不同来源的最后一分钟补丁一起投掷,以快速解决问题。虽然它确实有效,但并不是最干净的,肯定存在decisionHandler没有被调用的情况。我编辑了代码。谢谢! – 2014-10-23 13:00:58
此代码绝对是正确的路径,但它引入了一个安全漏洞,可能会导致不希望发起呼叫和FaceTime呼叫。看看我的解释在这里:https://github.com/dfmuir/KINWebBrowser/issues/10 – dfmuir 2014-10-25 06:15:42
这有助于我的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"
。
以上回答workes我,但我需要它改写为SWIFT 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
}
}
}
工程上的Xcode 8.1,雨燕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)
}
}
不要忘记添加委托:WKUIDelegate和var webView = WKWebView()属性 – 2016-11-22 13:03:49
您需要实施的其他回调得到这个权利(雨燕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,邮件,苹果商店,...得到直接从您的应用程序称为无需打开Safari
你不能这样做。如果这个功能对你来说很重要,那么这就是现在坚持使用UIWebView的原因 - 以及向Apple提交增强请求的原因。 UIWebView可以做WKWebView无法做到的事情。 – matt 2014-10-22 19:07:04