我有一个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%