iOS原生环境下WKWebView内按钮无法加载新窗口问题求助
解决WKWebView中about:blank新窗口无法加载的问题
这个问题我之前帮不少开发者排查过,核心是WKWebView对新窗口(尤其是通过about:blank中转的)的默认处理逻辑有局限——浏览器有完整的窗口管理机制能自动处理,但WKWebView需要咱们手动干预才能正常工作。下面是具体的解决步骤:
1. 必须实现WKUIDelegate的新窗口创建方法
WKWebView默认会忽略新窗口的请求,所以第一步要接管新窗口的创建逻辑。实现webView(_:createWebViewWith:for:windowFeatures:)方法,拦截新窗口请求并处理:
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { // 仅处理无目标框架的新窗口请求 guard navigationAction.targetFrame == nil, let targetURL = navigationAction.request.url else { return nil } // 方案1:在当前WebView直接加载目标URL(适合不需要新窗口的场景) webView.load(URLRequest(url: targetURL)) // 方案2:创建新的WKWebView用于独立窗口展示(比如模态弹出新页面) // let newWebView = WKWebView(frame: .zero, configuration: configuration) // newWebView.navigationDelegate = self // newWebView.uiDelegate = self // 后续可以把newWebView添加到新的ViewController中present/push // return newWebView return nil // 方案1返回nil,告诉WebView不用创建新窗口 }
2. 允许about:blank及后续跳转请求
有些网页会先打开about:blank,再通过JS给空白页跳转目标URL。这时候要确保WKWebView允许这类导航,通过WKNavigationDelegate的方法放行:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let url = navigationAction.request.url else { decisionHandler(.cancel) return } // 允许http/https以及about:blank的请求 let allowedSchemes = ["http", "https"] if allowedSchemes.contains(url.scheme?.lowercased() ?? "") || url.absoluteString == "about:blank" { decisionHandler(.allow) } else { decisionHandler(.cancel) } }
3. 别忘了设置Delegate
很多开发者容易漏掉这一步——初始化WKWebView后,必须绑定对应的Delegate,否则上面的方法根本不会被调用:
let webConfig = WKWebViewConfiguration() let webView = WKWebView(frame: view.bounds, configuration: webConfig) webView.uiDelegate = self webView.navigationDelegate = self view.addSubview(webView)
常见坑提示
- 如果网页用
window.open('about:blank')后再通过JS修改location,一定要接管新窗口的创建,否则WKWebView不会跟踪这个空白页的后续跳转。 - 若需要独立的新窗口展示,记得给新创建的WKWebView也设置好
uiDelegate和navigationDelegate,避免新窗口里再出现同样的问题。
内容的提问来源于stack exchange,提问作者BXV
相关产品推荐
相关产品推荐

