HTTPCookieStorage与WKWebsiteDataStore是否共享Cookie?
一、HTTPCookieStorage.shared与WKWebsiteDataStore.default()的依赖关系
iOS 11及以上系统中,持久化的默认WKWebsiteDataStore.default()实例与全局HTTPCookieStorage.shared存在双向延迟同步机制:
- WKWebView加载过程中,服务端通过响应头返回、前端JS写入的Cookie,存入WKWebsiteDataStore自有Cookie仓库的同时,会自动同步一份副本到
HTTPCookieStorage.shared - 业务代码手动写入
HTTPCookieStorage.shared的Cookie,WKWebView发起网络请求时会自动读取携带,无需手动注入到WKWebView的Cookie存储中 - 该同步不是强实时的,存在秒级延迟;如果App未初始化过WKWebView实例、或WKWebView未加载过任何页面,同步通道不会激活,此时修改任意一侧的Cookie都不会同步到另一侧
- 如果使用
WKWebsiteDataStore.nonPersistent(非持久化隐私浏览模式)的数据存储实例,不存在上述同步逻辑,其Cookie完全独立于全局共享存储
iOS 10及更早版本不存在这套同步机制,两个存储的Cookie完全隔离,互不干扰。
二、Cookie清理要求
必须同时清理两个存储的内容,仅清理WKWebsiteDataStore会出现旧Cookie残留问题:删除WKWebsiteDataStore内的Cookie后,HTTPCookieStorage.shared中留存的旧Cookie会在同步通道激活后,反向同步回WKWebsiteDataStore,导致登出状态失效、旧用户标识残留。
正确清理实现(Objective-C)
- 先清空全局共享HTTPCookieStorage内的所有Cookie
NSHTTPCookieStorage *sharedStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in sharedStorage.cookies) { [sharedStorage deleteCookie:cookie]; }
- 再清空WKWebsiteDataStore内的所有网站数据(包含自有Cookie、缓存、LocalStorage等站点数据),等待清理完成回调触发后再执行登出后续逻辑
WKWebsiteDataStore *defaultStore = [WKWebsiteDataStore defaultDataStore]; NSSet *allDataTypes = [WKWebsiteDataStore allWebsiteDataTypes]; [defaultStore fetchDataRecordsOfTypes:allDataTypes completionHandler:^(NSArray<WKWebsiteDataRecord *> *records) { [defaultStore removeDataOfTypes:allDataTypes forDataRecords:records completionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ // 所有Cookie清理完成,在此执行跳转登录页、销毁旧WKWebView实例等后续操作 }); }]; }];
补充说明:如果需要兼容iOS 10及更早版本,由于两个存储完全独立,同样需要执行上述双清操作,否则会出现对应系统版本下Cookie清理不彻底的问题。
内容的提问来源于stack exchange,提问作者Nitin Yadav
相关产品推荐
相关产品推荐

