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

设置navigationDelegate后WKWebView无法加载图片求助

问题描述

我在集成MobilePay支付功能时,用WKWebView加载https://sandprod-products.mobilepay.dk/链接,碰到个奇怪的问题:只要设置了WKNavigationDelegate并实现了方法,页面里的图片就加载不出来;但只挂代理不写任何方法的话,图片显示正常。哪怕把代理方法改成直接返回.allow,问题还是存在。已经在info.plist里加了ATS配置,没用。

我的代理实现:

extension PaymentsWebViewWrapperViewController: WKNavigationDelegate {
    func webView(_ webView: WKWebView,
                 decidePolicyFor navigationAction: WKNavigationAction,
                 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard let url = navigationAction.request.url else {
            decisionHandler(.allow)
            return
        }

        // 交易完成时跳转指定地址就拦截
        guard url.absoluteString != redirectUrl else {
            decisionHandler(.cancel)
            delegate?.didFinishAuthentication(pendingOrder: pendingOrder)
            return
        }

        decisionHandler(.allow)
    }
}

ATS配置:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>sandprod-products.mobilepay.dk</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSAllowsArbitraryLoadsInWebContent</key>
      <true/>
    </dict>
  </dict>
</dict>
解决方案

1. 补上响应策略的代理方法

设置WKNavigationDelegate后,光处理导航动作的允许逻辑可能不够,得显式允许所有资源的响应。加个这个方法试试:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    decisionHandler(.allow)
}

有些场景下,WebView会默认拦截资源响应,显式放行就能解决图片加载问题。

2. 查图片的实际域名,更新ATS配置

MobilePay页面里的图片说不定是从其他域名加载的(比如*.mobilepay.com或者别的子域名),你可以用浏览器打开那个链接,F12看图片的请求地址,把这些域名也加到ATS例外里:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>sandprod-products.mobilepay.dk</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSAllowsArbitraryLoadsInWebContent</key>
      <true/>
    </dict>
    <key>mobilepay.com</key> <!-- 替换成你查到的图片域名 -->
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSAllowsArbitraryLoadsInWebContent</key>
      <true/>
    </dict>
  </dict>
</dict>

3. 确认所有分支都调用了决策闭包

虽然你的代码看起来每个分支都调用了decisionHandler,但还是再检查一遍,别漏了——要是闭包没执行,WebView会一直挂着不加载资源。

4. 用默认配置初始化WKWebView

试试用默认配置创建WebView,排除自定义配置的冲突:

let config = WKWebViewConfiguration()
config.websiteDataStore = WKWebsiteDataStore.default()
let webView = WKWebView(frame: .zero, configuration: config)
webView.navigationDelegate = self

内容的提问来源于stack exchange,提问作者Yotam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:05:32