【问题标题】:Why is WKWebView not opening a telephone link in ios 9?为什么 WKWebView 没有在 ios 9 中打开电话链接?
【发布时间】:2017-12-03 18:41:33
【问题描述】:

我有一个 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 设备上,电话应用程序屏幕闪烁(无提示),之后没有任何反应。

【问题讨论】:

    标签: ios swift ios9 ios10 wkwebview


    【解决方案1】:

    斯威夫特 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)
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      继续前的关键概念:

      默认情况下,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>

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

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

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

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

      现在在 9 > iOS

      
      
          - (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发起拨号,不进一步提示用户,也不显示alert,虽然原生app可以配置成 显示自己的警报。

      请不要按照任何关于 URL scheme 白名单的说明,这是苹果在 iOS 9 上引入的另一个故事,但这是你需要声明 url scheme 处理程序的时候,目前 tel 方案由 iOS 处理。

      希望对您有所帮助。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多