解决UIWebView换WKWebView时cookie丢失问题

项目中遇到这个问题,困扰了很久,网上各种解决的方案都有,但是对我而言都没有用,包括(1)初始化webview的时候注入cookie(2)webview loadrequest的时候加上请求头(3)甚至让服务端的小伙伴把httponly设置的cookie对象置为false。完全没有效果(服务端的小伙伴也是性格超级好的,被我这么“执着”的人抓住)。下面是我呕心沥血的解决方案,希望能够帮助小伙伴们少走弯路。

解决这个问题需要了解已下几点

1、cookie是什么?

cookie 是服务端为了识别终端身份,保存在终端本地的用户凭证信息。cookie 中的字段与意义由服务端进行定义。例如,当用户在进行了登录操作后,服务端会将cookie 信息返回给终端,终端会将这些信息进行保存,在下一次再次访问服务端时,终端会将保存的cookie 信息一并发送到服务端,服务端根据cookie 信息是否有效来判断此用户是否可以进行一些行为。

2、cookie是怎样从客户端传递到服务端的?

iOS 中Cookie管理主要有两个类NSHTTPCookieNSHTTPCookieStorage,当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,因为NSHTTPCookieStorage的默认策略是:NSHTTPCookieAcceptPolicyAlways,所以如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的Cookie继续去请求。

3、为什么WKWebView会产生这个问题?

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的。

4、解决方案(该方法适用于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);

}

你可能感兴趣的:(解决UIWebView换WKWebView时cookie丢失问题)