【问题标题】:Catch and call telephone number in WKWebView在 WKWebView 中捕获并拨打电话号码
【发布时间】:2015-11-11 02:32:01
【问题描述】:

我有一个 WKWebView,我想在选择号码时要求拨打该号码。 Web 视图的内容包含 HTML 锚标记“tel:”,我正在寻找一种方法来捕捉它。用什么函数来捕捉这些标签?

【问题讨论】:

  • 刚刚验证了 UITextView 的 dataDetectorTypes 属性是否可以正常工作,我不确定 WKWebView 是否会将方案导航转发给 iOS。

标签: ios swift wkwebview


【解决方案1】:

设置webView的navigationDelegate属性,实现delegate的如下功能(WKNavigationDelegate)

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
    if navigationAction.request.url?.scheme == "tel" {
        UIApplication.shared.openURL(navigationAction.request.url!)
        decisionHandler(.cancel)
    } else {
        decisionHandler(.allow)
    }
}

从 iOS 10 开始,您还可以在 WKWebViewConfiguration 上将 dataDetectorTypes 设置为 .phoneNumber。所有检测到的电话号码都将转换为包含电话号码周围的链接,因此当点击电话号码时,将使用带有“tel”方案的 URL 触发上述函数。

configuration.dataDetectorTypes = .phoneNumber

【讨论】:

  • webView:decidePolicyForNavigationAction:decisionHandler:] 被多次调用'我得到那个错误
  • decisionHandler(.allow) 应该在 else 中。
【解决方案2】:

修复了使用“decidePolicyFor navigationAction”委托方法在WKWebView 中拨打电话:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.request.url?.scheme == "tel" {
        UIApplication.shared.openURL(navigationAction.request.url!)
        decisionHandler(.cancel)
    } else {
        decisionHandler(.allow)
    }
}

在设置您的网络视图时,在其配置中设置数据检测器类型:

if #available(iOS 10.0, *) {
    webView.configuration.dataDetectorTypes = .phoneNumber
}

【讨论】:

    【解决方案3】:

    Swift4

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    
    if navigationAction.targetFrame == nil {
    
    webView.load(navigationAction.request)
    
    }
    
    if navigationAction.request.url?.scheme == "tel" {
    
    UIApplication.shared.openURL(navigationAction.request.url!)
    
    decisionHandler(.cancel)
    
    }
    
    else if navigationAction.request.url?.scheme == "mailto" {
    
    UIApplication.shared.openURL(navigationAction.request.url!)
    
    decisionHandler(.cancel)
    
    }
    
    else{
    
    decisionHandler(.allow)
    
    }
    
    }
    

    您也可以see this example供您参考。它可以 100% 在真实设备上运行

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多