WKWebView中window.open()无效果,无法触发新标签页代理方法
解决WKWebView中window.open()不触发代理方法的问题
我帮你排查过这类问题,大概率是这几个细节没做好,一步步来解决:
务必给WKWebView设置UIDelegate
你虽然实现了WKUIDelegate协议,但很可能漏掉了给webView绑定这个代理!createWebViewWith是WKUIDelegate下的方法,不是WKNavigationDelegate的,所以必须在初始化webView时加上这行:override func viewDidLoad() { super.viewDidLoad() let config = WKWebViewConfiguration() webView = WKWebView(frame: view.bounds, configuration: config) webView.navigationDelegate = self webView.uiDelegate = self // 这行是关键!别漏! view.addSubview(webView) // 加载你的网页 }正确实现代理方法的逻辑
代理方法触发后,需要先判断请求是否是新窗口的请求(navigationAction.targetFrame == nil是window.open的典型特征),然后再处理。比如你可以选择在当前webView加载,或者创建新的WKWebView作为新标签页:func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { // 确认是新窗口请求 guard navigationAction.targetFrame == nil else { return nil // 如果targetFrame存在,让webView自己处理 } // 方案1:在当前webView加载该请求 webView.load(navigationAction.request) // 方案2:创建新的WKWebView(用于新标签页场景) // let newWebView = WKWebView(frame: view.bounds, configuration: configuration) // newWebView.uiDelegate = self // newWebView.navigationDelegate = self // 这里可以把newWebView添加到你的标签页容器或者push新的ViewController // return newWebView return nil }排查网页端的限制
有些网页会通过JavaScript覆盖window.open方法,或者有Content-Security-Policy限制弹窗。你可以直接在Safari调试控制台执行window.open('https://example.com')测试,如果这时候代理方法能触发,那问题出在网页的JS逻辑上;如果还是没触发,就回到客户端代码检查上面两点。确认配置没有禁用弹窗
默认的WKWebViewConfiguration是允许弹窗的,但如果你自定义了配置,要确保没有设置限制弹窗的参数,比如不要修改allowsWindowOpen(不过这个属性其实是iOS 16+才有的,低版本默认允许)。
内容的提问来源于stack exchange,提问作者Footjy
相关产品推荐
相关产品推荐

