我有一个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设备上,电话应用程序屏幕闪烁(没有提示),之后没有任何反应。
答案 0 :(得分:5)
继续之前的关键概念:
默认情况下,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>
&#13;
在这个简短的序言之后,WKWebView的两个行为,一个用于iOS 9,另一个用于iOS 10和更高版本。
iOS 10上的Apple在 WKWebViewConfiguration 上引入了一个名为 dataDetectorTypes 的属性,默认情况下,此属性的值为 WKDataDetectorTypeNone ,这意味着无法检测到没有。因此,如果您想要检测电话号码和链接(只是一个示例),WKWebView的配置将如下所示(假设您有一个 _webView 类型 WKWebView ) :
WKWebViewConfiguration *configuration = [WKWebViewConfiguration new];
if ([configuration respondsToSelector:@selector(dataDetectorTypes)]) {
configuration.dataDetectorTypes = UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber;
}
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
使用此配置,您的webView将能够处理所有内容。
现在9&gt; iOS&lt; 10(iOS在9到10之间)您的委托决策处理程序将如下所示:
- (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启动拨号而不进一步提示用户,并且不显示警报,尽管可以配置本机应用程序 显示自己的警报。
请不要按照任何谈论URL方案白名单的说法,这是苹果在iOS 9上介绍的另一个故事,但这是当你需要声明url方案处理程序时,目前tel方案由iOS处理。
希望这有帮助。
答案 1 :(得分:0)
快捷键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)
}
}
}