如何在WKWebView中启用跨站跟踪以正常获取iFrame内第三方Cookie
iOS 14开始WKWebView默认启用智能跟踪预防(ITP),规则逻辑和桌面端Safari存在差异,移动端WKWebView的跨站Cookie限制优先级高于系统Safari全局开关,所以会出现桌面端正常、移动端WebView异常的情况。以下是完整修复步骤:
已配置项的修正方案
NSCrossWebsiteTrackingUsageDescription仅为权限弹窗的描述文案,本身不会直接放行Cookie,需要你在代码中主动调用权限申请API,用户授权后配置才会生效:
Swift代码示例:
Objective-C代码示例:import WebKit WKWebsiteDataStore.default().requestCookieConsent { policy in // policy为.allow代表授权通过 }#import <WebKit/WebKit.h> [WKWebsiteDataStore.defaultDataStore requestCookieConsentWithCompletionHandler:^(WKHTTPCookieAcceptPolicy policy) { // policy == WKHTTPCookieAcceptPolicyAllow 代表授权成功 }];- 你配置的
WKAppBoundDomains规则不符合iOS 14的要求,该配置不支持通配符二级以上域名,也无需罗列所有子域名,仅需配置你应用的主域名和第三方服务顶级域名即可,正确配置格式:
注意:该配置最多仅支持添加10个域名,超出部分会自动失效。<key>WKAppBoundDomains</key> <array> <string>your-app-main-domain.com</string> <string>thirdparty.com</string> </array>
额外必须添加的配置
初始化WKWebView时,需要手动修改配置项启用相关权限:
let config = WKWebViewConfiguration() config.websiteDataStore = .default() // 开启跨源资源访问权限 config.preferences.setValue(true, forKey: "crossOriginRequestPolicy") if #available(iOS 14.0, *) { // 关键:启用App Bound Domains限制,否则WKAppBoundDomains配置不会生效 config.limitsNavigationsToAppBoundDomains = true }
第三方服务适配要求
第三方返回的Cookie必须携带SameSite=None; Secure属性,如第三方未适配该规则,哪怕客户端所有配置正确,iOS 14也会自动拦截该Cookie。你可以联系第三方服务调整Cookie属性,也可以在WKWebView的请求拦截逻辑中手动给Cookie补充该属性。
验证步骤
- 卸载测试设备上的旧应用,清理所有缓存和网站数据
- 重新安装应用,首次打开时会弹出跨站跟踪权限申请弹窗,点击允许
- 进入WebView页面加载完成后,用Safari开发者工具连接WebView,查看存储选项卡下的第三方域名Cookie是否正常写入
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

