在iOS 26 WebView中加载HTML,点击链接跳转至默认浏览器(如Safari)
在iOS WKWebView中让链接跳转至默认浏览器
核心思路
拦截WebView内的链接请求,当检测到是用户主动点击的外部链接时,调用系统API唤起默认浏览器打开该链接,同时阻止WebView自身加载此链接。
实现步骤
配置WKWebView并设置代理
确保你的视图控制器遵守WKNavigationDelegate协议,初始化WKWebView并绑定代理:import WebKit class YourViewController: UIViewController, WKNavigationDelegate { private var webView: WKWebView! override func viewDidLoad() { super.viewDidLoad() let webConfig = WKWebViewConfiguration() webView = WKWebView(frame: view.bounds, configuration: webConfig) webView.navigationDelegate = self view.addSubview(webView) // 加载目标HTML内容(示例为本地HTML字符串) let htmlContent = "<html><body><p><a href='https://example.com'>点击打开外部链接</a></p></body></html>" webView.loadHTMLString(htmlContent, baseURL: nil) } }拦截链接请求并处理跳转
实现WKNavigationDelegate的decidePolicyFor navigationAction方法,精准拦截用户点击的链接并跳转至默认浏览器:func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { // 仅处理用户主动点击的链接,排除自动跳转等场景 guard navigationAction.navigationType == .linkActivated, let targetURL = navigationAction.request.url else { decisionHandler(.allow) return } // 验证URL可被系统打开后,唤起默认浏览器 if UIApplication.shared.canOpenURL(targetURL) { UIApplication.shared.open(targetURL) decisionHandler(.cancel) // 阻止WebView加载该链接 } else { decisionHandler(.allow) // 无法打开时,让WebView正常处理 } }可选:Info.plist配置
若需打开某些特殊协议的链接(如自定义scheme),需在Info.plist中添加LSApplicationQueriesSchemes数组,填入对应的协议名称(例如https、mailto),不过常见的HTTP/HTTPS协议无需额外配置。
注意事项
- 确保链接带有完整的协议前缀(如
http://或https://),否则canOpenURL可能返回false导致无法跳转。 - 不要拦截所有请求,仅针对用户主动点击的链接处理,避免破坏WebView内部的正常页面逻辑。
内容的提问来源于stack exchange,提问作者t9mike
相关产品推荐
相关产品推荐

