iOS WKWebView自定义协议请求被拦截问题求助
问题分析与解决方案
核心原因
你遇到的拦截并非App层面的ATS(App Transport Security)限制,而是**HTTPS页面的内容安全策略(CSP)**阻止了自定义协议customsource://加载的GLB资源。ATS配置仅管控App与服务器之间的网络请求合法性,无法干预Web页面内部的资源加载规则。
PNG能正常加载,大概率是因为CSP中对图片资源(img-src指令)的限制更宽松,允许了非HTTPS源,而GLB对应的3D模型资源(model-src指令)未被授权使用自定义协议。
解决步骤
1. 修改Web页面的CSP配置
检查页面的CSP规则(两种存在形式):
- 页面中的
<meta http-equiv="Content-Security-Policy">标签 - 服务器返回的
Content-Security-Policy响应头
需要在CSP中添加对customsource:协议的授权,针对GLB资源需配置model-src指令,若涉及网络请求加载还需配置connect-src,通用资源可通过default-src覆盖:
示例1:修改meta标签
<meta http-equiv="Content-Security-Policy" content=" default-src 'self' https: customsource:; img-src 'self' https: data:; model-src customsource:; ">
示例2:修改服务器响应头
Content-Security-Policy: default-src 'self' https: customsource:; img-src 'self' https: data:; model-src customsource:;
2. 无法修改Web页面时,通过WKWebView注入CSP规则
如果无法直接修改Web页面的CSP,可通过WKWebView的用户脚本在页面加载前注入CSP配置:
Swift代码示例
// 创建注入CSP的用户脚本 let cspInjectionScript = WKUserScript( source: """ const meta = document.createElement('meta'); meta.httpEquiv = 'Content-Security-Policy'; meta.content = 'default-src \\'self\\' https: customsource:; model-src customsource:;'; document.head.insertBefore(meta, document.head.firstChild); """, injectionTime: .atDocumentStart, forMainFrameOnly: true ) // 配置WKWebView并添加脚本 let webConfig = WKWebViewConfiguration() webConfig.userContentController.addUserScript(cspInjectionScript) let webView = WKWebView(frame: view.bounds, configuration: webConfig) view.addSubview(webView)
关键提醒
ATS的Allow Arbitrary Loads和Allow Arbitrary Loads in Web Content配置对当前问题无效,因为它们解决的是App向非HTTPS服务器发起请求的限制,而非Web页面内部的资源加载拦截。
内容的提问来源于stack exchange,提问作者Tripurari Shankar
相关产品推荐
相关产品推荐

