WKWebView 同UIWebView 的cookie 管理機(jī)制還是不一樣的。
UIWebView 、AFN 等等吧,可以通過?NSHTTPCookieStorage (單例類)統(tǒng)一管理,設(shè)置不同的域名、不同的cookieName、cookieValue。 ?
?WKWebView 沒有用?NSHTTPCookieStorage 這個(gè)類管理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 初始化的時(shí)候,通過配置類,實(shí)現(xiàn)了注入cookie。
2、JS 注入 WKWebView 代理方法
?//js 注入cookie ? ? ? ?
?[_webView evaluateJavaScript:@"document.cookie ='cookieName=cookieValue';" completionHandler:^(id result, NSError *error) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????//注入成功
}];
ps:如果進(jìn)入當(dāng)前頁面就需要狀態(tài)的時(shí)候,需要在初始化的時(shí)候?qū)懭隿ookie。在代理方法,?-(void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler 里加入應(yīng)該也可以,這點(diǎn)沒有驗(yàn)證。
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 請(qǐng)求里加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等動(dòng)態(tài)語言直接能從$_COOKIE對(duì)象中獲取到,但是js讀取不到,瀏覽器也看不到
所以合理的辦法讓js,php,瀏覽器都能讀取到相同的Cookie方法就是創(chuàng)建WebView的時(shí)候javascript注入Cookie,一開始發(fā)送NSMutableURLRequest請(qǐng)求的時(shí)候也要加上Cookie,并且保證兩個(gè)地方的設(shè)置的cookie一致。