WKWebview注入cookie的幾種方法

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一致。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容