WKWebView 同UIWebView 的cookie 管理机制还是不一样的。
UIWebView 、AFN 等等吧,可以通过 NSHTTPCookieStorage (单例类)统一管理,设置不同的域名、不同的cookieName、cookieValue。
WKWebView 没有用 NSHTTPCookieStorage 这个类管理cookie。所以想要给 WKWebView 注入cookie,有以下方法
1、JS注入 WKWebView初始化
WKUserContentController *userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource:@"document.cookie ='cookieName=cookieValue';" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
config.userContentController = userContentController;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0 , 100, 200 ) configuration:config ];
在WKWebView 初始化的时候,通过配置类,实现了注入cookie。
2、JS 注入 WKWebView 代理方法
//js 注入cookie
[_webView evaluateJavaScript:@"document.cookie ='cookieName=cookieValue';" completionHandler:^(id result, NSError *error) { //注入成功
}];
ps:如果进入当前页面就需要状态的时候,需要在初始化的时候写入cookie。在代理方法, -(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler 里加入应该也可以,这点没有验证。
3、iOS 11 推出 WKHTTPCookieStore
if (@available(iOS 11.0, *)) {
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{NSHTTPCookieName: @"cookeName",NSHTTPCookieValue:@"cookieValue",NSHTTPCookieDomain:@"cookieDomain",NSHTTPCookiePath: @"/" }];
[_webView.configuration.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:^{ }];
}
4、在request 请求里加cookie
NSURL *url = [NSURL URLWithString:_urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"cookieName=cookieValue" forHTTPHeaderField:@"Cookie"];
[_webView loadRequest:request];
NOTICE:
JS注入的Cookie,比如PHP代码在Cookie容器中取是取不到的, javascript document.cookie能读取到,浏览器中也能看到。
NSMutableURLRequest 注入的PHP等动态语言直接能从$_COOKIE对象中获取到,但是js读取不到,浏览器也看不到
所以合理的办法让js,php,浏览器都能读取到相同的Cookie方法就是创建WebView的时候javascript注入Cookie,一开始发送NSMutableURLRequest请求的时候也要加上Cookie,并且保证两个地方的设置的cookie一致。
网友评论