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

Gus*_*nge 2 ios swift wkwebview ios9 ios10

我有一个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)
}
Run Code Online (Sandbox Code Playgroud)

这在安装了ios 10的任何设备上都能正常工作,系统会提示我提示取消或拨打电话.但在ios 9设备上,电话应用程序屏幕闪烁(没有提示),之后没有任何反应.

小智 5

进行前的关键概念:

默认情况下,Web视图会自动将Web内容中显示的电话号码转换为电话链接.点击电话链接后,电话应用程序将启动并拨打该号码.该电话 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>
Run Code Online (Sandbox Code Playgroud)

在这个简短的序言之后,WKWebView有两种行为,一种适用于iOS 9,另一种适用于iOS 10及更高版本.

iOS上的10苹果公司推出了一款名为属性dataDetectorTypesWKWebViewConfiguration,默认情况下这个属性的值为WKDataDetectorTypeNone至极的手段,不检测什么.因此,如果你想检测电话号码和链接(只是一个例子),WKWebView的配置将如下所示(假设你有一个WKWebView类型的变量_webView):



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

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

Run Code Online (Sandbox Code Playgroud)

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

现在9> iOS <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);
        }

    }

Run Code Online (Sandbox Code Playgroud)

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

iOS 10.3及更高版本会在拨号前显示警报并要求用户确认.(当此方案中之前10.3的iOS版本发生时,发起的iOS拨号无需进一步提示用户并且不显示警报,虽然本机应用程序可经配置以显示其自己的警报.

请不要按照任何关于URL方案白名单的说明进行操作,这是苹果在iOS 9上引入的另一个故事,但这是当你需要声明url方案处理程序时,现在tel方案由iOS处理.

希望这有帮助.