Swift WKWebView部分重定向链接无法加载问题求助
WKWebView导航代理无法加载特定链接的问题
代理代码
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let url = navigationAction.request.url, let scheme = url.scheme else { decisionHandler(.cancel) return } // UIApplication.shared.open(url, options: [:]) <- 可打开但不想跳转Safari // webView.load(URLRequest(url: url)) <- 无效 decisionHandler(.allow) <- 无效 }
问题详情
- 某广告链接:调用
load方法或decisionHandler(.allow)均无法加载(其他链接正常),链接内容:https://googleads.g.doubleclick.net/pcs/click?xai=AKAOjsulcITSmZ0z5pq-Fm4gRcby0MY3XDGdBQ9P0VcUSq5vRrRY5oquSebdiCSkVQsI3C-5KypcWh_RVVN9I62STn_vbYr6hA6UcYTpZEfw0Hm1swqBGpmD3ZJDq1QCoC_XOkNMLGXHJwm4Jk9Zjw0l9K-HsGUbzZmGRusq1qZ-yJEXVMWtDF7oBM3uayRqQ4QCsJPJHCgzl9dULq-cAQvnYG4mlM3_Lo-EenB1UXciUMthZX-qzjD0ioVHbezNjN94Ona5UdkmOg4v3ipF3RVFXO7YyPjsblSkUOI5K5VgtHi3KObSDZDtg3g2x0AAASgU8Q&sai=AMfl-YSar3L61Tu_2cYOdew53xYAKFUkSe0nXaSrK_cbcVfon6D6hUTQ7tQmArm_V2o3VspTdDNjXQ7aSCVdw1XsGfAzrbheRzyS2lgFDbfsTrTR&sig=Cg0ArKJSzBZk-HtVwUYF&fbs_aeid=%5Bgw_fbsaeid%5D&adurl=https://www.iberdrola.es/servicios/equipos/smart-solar/oferta-energia-solar-unifamiliar-comunidades&nm=1&nx=225&ny=-37&mb=1&clkt=2 - 某AddThis链接:甚至不会触发
decidePolicyFor navigationAction方法,链接内容:https://www.addthis.com/bookmark.php?v=300&winname=addthis&pub=ra-62320da012f4f327&source=tbx-300&lng=es&s=whatsapp&wid=i1gy&url=https%3A%2F%2Fwww.tribunavalladolid.com%2F&title=Tribuna%20de%20Valladolid.%20Noticias%20Castilla%20y%20Le%C3%B3n.%20Noticias%20Valladolid&ate=AT-ra-62320da012f4f327/-/-/62ff3759d4f4d6bb/8&frommenu=1&ips=1&uid=62cfeb788b64c651&description=Noticias%20sobre%20Valladolid%20y%20su%20provincia.%20Deportes%2C%20sucesos%2C%20cultura%2C%20econom%C3%ADa%2C%20empresas%2C%20en%20tu%20peri%C3%B3dico%20digital%20de%20Valladolid.&uud=1&ct=1&pre=https%3A%2F%2Fwww.google.com%2F&tt=0&captcha_provider=recaptcha2&pro=0
注:使用UIApplication.shared.open(url, options: [:])可打开目标页面,但需求是在WKWebView内加载,不跳转Safari。
解决方案
广告链接加载问题处理
这类DoubleClick跳转链接依赖请求上下文(如请求头、Cookie),直接调用decisionHandler(.allow)或重新构造URLRequest会丢失关键信息,可按以下方式修改代理方法:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { guard let url = navigationAction.request.url else { decisionHandler(.cancel) return } // 识别广告跳转链接 if url.host?.contains("googleads.g.doubleclick.net") == true { // 取消原导航,复用原请求加载(保留所有上下文) decisionHandler(.cancel) webView.load(navigationAction.request) } else { decisionHandler(.allow) } }
同时确保WKWebView启用默认Cookie存储:
let config = WKWebViewConfiguration() config.websiteDataStore = WKWebsiteDataStore.default() let webView = WKWebView(frame: .zero, configuration: config)
AddThis链接不触发代理问题处理
AddThis链接通常通过window.open发起新窗口请求,默认不会触发decidePolicyFor navigationAction,需实现createWebViewWith代理方法拦截:
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { // 在当前webView加载新窗口请求 if let url = navigationAction.request.url { webView.load(navigationAction.request) } // 返回nil表示不创建新窗口 return nil }
注意需确保WKWebView的navigationDelegate已正确设置,否则代理方法不会被调用。
内容的提问来源于stack exchange,提问作者user19546760
相关产品推荐
相关产品推荐

