获取并拨打WKWebView中的电话号码



我有一个WKWebView,我想在选择号码时要求它拨打一个号码。web视图的内容包含HTML锚标记"tel:",我正在寻找捕捉它的方法。哪个函数用于捕捉这些标记?

设置webView的navigationDelegate属性并实现委托的以下功能(WKNavigationDelegate

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

从iOS 10开始,您还可以在WKWebViewConfiguration上将dataDetectorTypes设置为.phoneNumber。所有检测到的电话号码都将被转换为包含电话号码周围的链接,因此上述功能将用带有";电话";敲击电话号码时的scheme。

configuration.dataDetectorTypes = .phoneNumber

修复了在WKWebView中使用"decidePolicyFornavigationAction"委托方法拨打电话的问题:

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)
    }
}

设置web视图时,在其配置上设置数据检测器类型:

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

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)
}
}

您也可以看到这个例子供您参考。它在真实设备上工作100%

最新更新