iOS 11 WKWebView中tel链接仅长按生效,单击无响应求助
嘿,这个问题我之前帮不少开发者排查过类似的,iOS 11.x的WKWebView在iPhone上对tel链接的处理确实有个小坑,咱们一步步来搞定它:
解决WKWebView中tel链接iPhone端单击无响应的问题
核心原因是iOS 11的WKWebView在iPhone设备上,默认不会自动拦截并处理tel://这类scheme的单击事件(反而iPad因为没有原生电话功能,触发了系统的弹出选择逻辑),所以咱们需要手动拦截请求并调用系统功能。
步骤1:实现WKNavigationDelegate拦截逻辑
首先让你的ViewController遵守WKNavigationDelegate协议,然后实现webView(_:decidePolicyFor:decisionHandler:)方法来拦截tel链接:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { // 检查当前请求的URL是否为tel开头的链接 guard let url = navigationAction.request.url, url.scheme == "tel" else { // 非tel链接,允许WKWebView正常加载 decisionHandler(.allow) return } // 确认系统可以打开tel链接后,唤起电话应用 if UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url, options: [:], completionHandler: nil) } // 告诉WKWebView不要继续加载这个tel链接,避免无意义的请求 decisionHandler(.cancel) }
步骤2:绑定WKWebView的navigationDelegate
在你初始化WKWebView的代码里,一定要把它的navigationDelegate设置为当前ViewController,不然上面的拦截逻辑根本不会生效:
// 初始化WKWebView配置和实例 let webConfig = WKWebViewConfiguration() let webView = WKWebView(frame: view.bounds, configuration: webConfig) // 绑定代理,这一步千万别忘! webView.navigationDelegate = self view.addSubview(webView)
额外注意点
- 如果你还需要处理
mailto:、sms:这类其他自定义scheme,完全可以用同样的逻辑扩展判断条件。 - 确保你的
Info.plist没有限制tel scheme的跳转:如果项目里添加了LSApplicationQueriesSchemes数组,记得把tel加进去(默认不添加这个数组的话,系统是允许tel跳转的):<key>LSApplicationQueriesSchemes</key> <array> <string>tel</string> </array> - 测试提示:模拟器上单击tel链接不会有任何反应(毕竟模拟器没有电话功能),一定要用真实的iPhone设备测试效果哦。
这样处理之后,iPhone端的WKWebView单击tel链接就会直接唤起系统的呼叫提示弹窗,和iPad上的体验保持一致啦。
内容的提问来源于stack exchange,提问作者user3650307
相关产品推荐
相关产品推荐

