You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:57:02