设置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
相关产品推荐
相关产品推荐

