1.了解cookie 是啥
cookie 是服务端为了识别终端身份,保存在终端本地的用户凭证信息。cookie 中的字段与意义由服务端进行定义。例如,当用户在进行了登录操作后,服务端会将cookie 信息返回给终端,终端会将这些信息进行保存,在下一次再次访问服务端时,终端会将保存的cookie 信息一并发送到服务端,服务端根据cookie 信息是否有效来判断此用户是否可以进行一些行为。
2.为什么cookie会丢失
NSURLCache和NSHTTPCookieStroage无法操作(WKWebView)WebCore进程的缓存和Cookie。
WKWebView实例将会忽略任何的默认网络存储器(NSURLCache, NSHTTPCookieStorage, NSCredentialStorage) 和一些标准的自定义网络请求类(NSURLProtocol,等等.)。
WKWebView实例不会把Cookie存入到App标准的的Cookie容器(NSHTTPCookieStorage)中,因为 NSURLSession/NSURLConnection等网络请求使用NSHTTPCookieStorage进行访问Cookie,所以不能访问WKWebView的Cookie,现象就是WKWebView存了Cookie,其他的网络类如NSURLSession/NSURLConnection却看不到。,
与Cookie相同的情况就是WKWebView的缓存,凭据等。WKWebView都拥有自己的私有存储,因此和标准Cocoa网络类兼容的不是那么好。
你也不能自定义requests(增加自己的http header,更改已经存在的header)使用自定义的 URL schemes等等,因为NSURLProtocol也是不支持WKWebView的。
3.解决措施
"GGWkCookie" 此第三方库不错
解决方案(该方法适用于ios11版本之后)只需要添加这几行代码,问题完美解决
- (void)webView:(WKWebView*)webView decidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponse decisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler{
NSArray *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;
WKHTTPCookieStore *cookieStroe = webView.configuration.websiteDataStore.httpCookieStore;
for(NSHTTPCookie*cookieincookies) {
[cookieStroesetCookie:cookiecompletionHandler:nil];
}
decisionHandler(WKNavigationResponsePolicyAllow);
}