【发布时间】:2015-11-11 02:32:01
【问题描述】:
我有一个 WKWebView,我想在选择号码时要求拨打该号码。 Web 视图的内容包含 HTML 锚标记“tel:”,我正在寻找一种方法来捕捉它。用什么函数来捕捉这些标签?
【问题讨论】:
-
刚刚验证了 UITextView 的 dataDetectorTypes 属性是否可以正常工作,我不确定 WKWebView 是否会将方案导航转发给 iOS。
我有一个 WKWebView,我想在选择号码时要求拨打该号码。 Web 视图的内容包含 HTML 锚标记“tel:”,我正在寻找一种方法来捕捉它。用什么函数来捕捉这些标签?
【问题讨论】:
设置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
【讨论】:
修复了使用“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
}
【讨论】:
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% 在真实设备上运行
【讨论】: