WKWebView會忽視默認的網(wǎng)絡存儲, NSURLCache, NSHTTPCookieStorage, NSCredentialStorage。 目前是這樣的,WKWebView有自己的進程,同樣也有自己的存儲空間用來存儲cookie和cache, 其他的網(wǎng)絡類如NSURLConnection是無法訪問到的。 同時WKWebView發(fā)起的資源請求也是不經(jīng)過NSURLProtocol的,導致無法自定義請求。
WKWebView與UIWebview的一個區(qū)別,就是WKWebView實例將會忽略任何的默認網(wǎng)絡存儲器(NSURLCache, NSHTTPCookieStorage, NSCredentialStorage) 和一些標準的自定義網(wǎng)絡請求類(NSURLProtocol,等等.).
WKWebView實例不會把Cookie存入到App標準的的Cookie容器(NSHTTPCookieStorage)中,因為 NSURLSession/NSURLConnection等網(wǎng)絡請求使用NSHTTPCookieStorage進行訪問Cookie,所以不能訪問WKWebView的Cookie,現(xiàn)象就是WKWebView存了Cookie,其他的網(wǎng)絡類如NSURLSession/NSURLConnection卻看不到。
與Cookie相同的情況就是WKWebView的緩存,憑據(jù)等。WKWebView都擁有自己的私有存儲,因此和標準cocoa網(wǎng)絡類兼容的不是那么好
在WKWebView創(chuàng)建時JS注入
//OC代碼
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie ='TeskCookieKey1=TeskCookieValue1';document.cookie = 'TeskCookieKey2=TeskCookieValue2';"injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
WKWebViewConfiguration* webViewConfig = WKWebViewConfiguration.new;
webViewConfig.userContentController = userContentController;
WKWebView * webView = [[WKWebView alloc] initWithFrame:CGRectMake(/*set your values*/) configuration:webViewConfig];
在webview load request的時候注入到header
//oc代碼
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
}
// cookie重復,先放到字典進行去重,再進行拼接
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url]];
[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];
NSLog(@"添加cookie");
[self.webView loadRequest:request];
iOS11后通過系統(tǒng)api注入
在iOS11中,蘋果新增加了用于WKWebview Cookie存取操作的WKHTTPCookieStore。
注意:
JS注入的Cookie,比如PHP代碼在Cookie容器中取是取不到的, javascript document.cookie能讀取到,瀏覽器中也能看到。
NSMutableURLRequest 注入的PHP等動態(tài)語言直接能從$_COOKIE對象中獲取到,但是js讀取不到,瀏覽器也看不到
所以合理的辦法讓js,php,瀏覽器都能讀取到相同的Cookie方法就是創(chuàng)建WebView的時候javascript注入Cookie,一開始發(fā)送NSMutableURLRequest請求的時候也要加上Cookie,并且保證兩個地方的設置的cookie一致。