UIWebView 和 WKWebView cookie 設置獲取

1. NSHTTPCookieStorage和NSHttpCookie

  • NSHTTPCookieStorage 實現(xiàn)了一個管理Cookie的單例對象(只有一個實例)山橄,每個Cookie都是NSHTTPCookie類的實例大审,做為一個規(guī)則,Cookie在所有應用 之間共享并在不同進程之間保持同步古程。Session Cookie(一個isSessionOnly方法返回YES的Cookie)只能在單一進程中使用谈截。

2. UIWebView Cookie

  • 同一個應用玖院,不同UIWebView之間的Cookie是自動同步的。并且可以被其他網(wǎng)絡類訪問比如NSURLConnection,AFNetworking律杠。

  • 它們都是保存在NSHTTPCookieStorage容器中潭流。 當UIWebView加載一個URL的時候竞惋,在加載完成時候,Http Response灰嫉,對Cookie進行寫入,更新或者刪除拆宛,結(jié)果更新Cookie到NSHTTPCookieStorage存儲容器中。

3. WKWebView Cookie

  • NSURLCache和NSHTTPCookieStroage無法操作(WKWebView)WebCore進程的緩存和Cookie熬甫。

  • 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)絡類兼容的不是那么好。

  • 你也不能自定義requests(增加自己的http header厂榛,更改已經(jīng)存在的header)使用自定義的 URL schemes等等盖矫,因為NSURLProtocol也是不支持WKWebView的。

4. WKWebView Cookie 寫入

  • 使用傳統(tǒng)的UIWebView時代的方法寫入經(jīng)過測試無效击奶,我們盼望著蘋果會在新的SDK版本中增加更多特性辈双,但是問題是我們的App不僅僅是針對于新的iOS版本,所以老的版本還需要不同的方法解決問題柜砾。
  • JS 注入
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];
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    [webView evaluateJavaScript:@"document.cookie ='TeskCookieKey1=TeskCookieValue1';" completionHandler:^(id result, NSError *error) {
        //...
    }];
}
  • NSMutableURLRequest
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://dev.skyfox.org/cookie.php"]];
//[request setHTTPShouldHandleCookies:YES];
[request setValue:[NSString stringWithFormat:@"%@=%@",@"testwkcookie", @"testwkcookievalue"] forHTTPHeaderField:@"Cookie"];
  • 注意:
  1. JS注入的Cookie湃望,比如PHP代碼在Cookie容器中取是取不到的, javascript document.cookie能讀取到痰驱,瀏覽器中也能看到证芭。

  2. NSMutableURLRequest 注入的PHP等動態(tài)語言直接能從$_COOKIE對象中獲取到,但是js讀取不到担映,瀏覽器也看不到

  3. 所以合理的辦法讓js废士,php,瀏覽器都能讀取到相同的Cookie方法就是創(chuàng)建WebView的時候javascript注入Cookie蝇完,一開始發(fā)送NSMutableURLRequest請求的時候也要加上Cookie官硝,并且保證兩個地方的設置的cookie一致。

//初始化
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie ='TeskCookieKey3=TeskCookieValue3';"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];
 
//請求
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://dev.skyfox.org/cookie.php"]];
//[request setHTTPShouldHandleCookies:YES];
[request setValue:[NSString stringWithFormat:@"%@=%@",@"TeskCookieKey3", @"TeskCookieValue3"] forHTTPHeaderField:@"Cookie"];
[webView loadRequest:request];

5. WKWebsiteDataStore

WKWebsiteDataStore在iOS 9和OS X 10.11中引入短蜕,是一個新的API泛源,它用于管理一個網(wǎng)站站點存儲的數(shù)據(jù),例如Cookies忿危,它是你網(wǎng)頁的 WKWebViewConfiguration上的一個可讀寫的屬性。你可以根據(jù)類型或者時間來刪除數(shù)據(jù)没龙,例如Cookies和緩存铺厨,你可以用非持久性數(shù) 據(jù)存儲來改變配置缎玫。

6. WKWebView Cookie 讀取

因為cookie都存在http respone的headerfields,找到能獲得respone的WKWebView回調(diào),打印..

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
    NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
    NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];
    //讀取wkwebview中的cookie 方法1
    for (NSHTTPCookie *cookie in cookies) {
//        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        NSLog(@"wkwebview中的cookie:%@", cookie);
 
    }
    //讀取wkwebview中的cookie 方法2 讀取Set-Cookie字段
    NSString *cookieString = [[response allHeaderFields] valueForKey:@"Set-Cookie"];
    NSLog(@"wkwebview中的cookie:%@", cookieString);
 
    //看看存入到了NSHTTPCookieStorage了沒有
    NSHTTPCookieStorage *cookieJar2 = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *cookie in cookieJar2.cookies) {
        NSLog(@"NSHTTPCookieStorage中的cookie%@", cookie);
    }
    decisionHandler(WKNavigationResponsePolicyAllow);
}

結(jié)果確實讀取到了Cookie,但是打印NSHTTPCookieStorage單例中Cookie發(fā)現(xiàn)并沒有任何Cookie解滓。

7.WKWebsiteDataStore iOS9

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore];
    [dataStore fetchDataRecordsOfTypes:[WKWebsiteDataStore allWebsiteDataTypes]
                     completionHandler:^(NSArray<WKWebsiteDataRecord *> * __nonnull records) {
                         for (WKWebsiteDataRecord *record  in records)
                         {
                             NSLog(@"WKWebsiteDataRecord:%@",[record description]);
                         }
                     }];
    
}

8. WKHTTPCookieStore iOS11

在iOS11中赃磨,蘋果新增加了用于WKWebview Cookie存取操作的WKHTTPCookieStore。

A WKHTTPCookieStore object allows managing the HTTP cookies associated with a particular WKWebsiteDataStore.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洼裤,一起剝皮案震驚了整個濱河市邻辉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腮鞍,老刑警劉巖值骇,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異移国,居然都是意外死亡吱瘩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門迹缀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來使碾,“玉大人,你說我怎么就攤上這事祝懂∑币。” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵砚蓬,是天一觀的道長矢门。 經(jīng)常有香客問我,道長怜械,這世上最難降的妖魔是什么颅和? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮缕允,結(jié)果婚禮上峡扩,老公的妹妹穿的比我還像新娘。我一直安慰自己障本,他們只是感情好教届,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驾霜,像睡著了一般案训。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粪糙,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天强霎,我揣著相機與錄音,去河邊找鬼蓉冈。 笑死城舞,一個胖子當著我的面吹牛轩触,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播家夺,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼脱柱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拉馋?” 一聲冷哼從身側(cè)響起榨为,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煌茴,沒想到半個月后随闺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡景馁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年板壮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片合住。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡绰精,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出透葛,到底是詐尸還是另有隱情笨使,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布僚害,位于F島的核電站硫椰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏萨蚕。R本人自食惡果不足惜靶草,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岳遥。 院中可真熱鬧奕翔,春花似錦、人聲如沸浩蓉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捻艳。三九已至驾窟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間认轨,已是汗流浹背绅络。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恩急。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像假栓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霍掺,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容