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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:15:27