为什么WKWebView没有在ios 9中打开电话链接?

时间:2017-06-29 22:04:14

标签: ios swift ios9 ios10 wkwebview

我有一个WKWebView,可以在网页上加载带有一些电话链接的网页。

目前我有这个代码来处理这些链接的点击次数。

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.request.url?.scheme == "tel" {
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(navigationAction.request.url!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(navigationAction.request.url!)
        }
        decisionHandler(.cancel)
        return
    }
    decisionHandler(.allow)
}

这在安装了ios 10的任何设备上都能正常工作,我会看到一个警告框要求取消或拨打电话。但在ios 9设备上,电话应用程序屏幕闪烁(没有提示),之后没有任何反应。

2 个答案:

答案 0 :(得分:5)

继续之前的关键概念:

  

默认情况下,Web视图会自动将Web内容中显示的电话号码转换为电话链接。点击电话链接后,电话应用程序将启动并拨打该号码。 tel URL方案用于在iOS设备上启动手机应用并启动拨打指定的电话号码。

从html方面显示电话号码的网页必须如下:



<body>
     <!-- Then use phone links to explicitly create a link. -->
     <p>A phone number: <a href="tel:1-408-555-5555">1-408-555-5555</a></p>
     <!-- Otherwise, numbers that look like phone numbers are not links. -->
     <p>Not a phone number: 408-555-5555</p>
</body>
&#13;
&#13;
&#13;

在这个简短的序言之后,WKWebView的两个行为,一个用于iOS 9,另一个用于iOS 10和更高版本。

iOS 10上的

Apple在 WKWebViewConfiguration 上引入了一个名为 dataDetectorTypes 的属性,默认情况下,此属性的值为 WKDataDetectorTypeNone ,这意味着无法检测到没有。因此,如果您想要检测电话号码和链接(只是一个示例),WKWebView的配置将如下所示(假设您有一个 _webView 类型 WKWebView ) :



    WKWebViewConfiguration *configuration = [WKWebViewConfiguration new];
    if ([configuration respondsToSelector:@selector(dataDetectorTypes)]) {
        configuration.dataDetectorTypes = UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber;
    }

    _webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];

使用此配置,您的webView将能够处理所有内容。

现在9&gt; iOS&lt; 10(iOS在9到10之间)您的委托决策处理程序将如下所示:



    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

     if ([navigationAction.request.URL.scheme isEqualToString:@"tel"]){

            [UIApplication.sharedApplication openURL:navigationAction.request.URL];

            decisionHandler(WKNavigationActionPolicyCancel);

        }else {
            decisionHandler(WKNavigationActionPolicyAllow);
        }

    }

这将打开手机应用程序。请记住:

  

iOS 10.3及更高版本显示警报并需要用户确认   拨号之前。 (当这种情况发生在之前的iOS版本中时   10.3,iOS启动拨号而不进一步提示用户,并且不显示警报,尽管可以配置本机应用程序   显示自己的警报。

请不要按照任何谈论URL方案白名单的说法,这是苹果在iOS 9上介绍的另一个故事,但这是当你需要声明url方案处理程序时,目前tel方案由iOS处理。

希望这有帮助。

答案 1 :(得分:0)

快捷键4:

 webView.navigationDelegate = self
 webView.configuration.dataDetectorTypes = [.link, .phoneNumber]

extension PDFWebViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let requestUrl = navigationAction.request.url, requestUrl.scheme == "tel" {
            UIApplication.shared.open(requestUrl, options: [:], completionHandler: nil)
            decisionHandler(.cancel)

        } else {
            decisionHandler(.allow)
        }
    }

}