iOS之WKWebView 的Cookie讀取與注入 同步登陸番外篇

開發(fā)個新項目娱俺,全部用web端稍味,就原生的幾個tabbar,于是選擇了WKWebView
荠卷,把遇到的問題總結(jié)下模庐。

WKWebView手勢返回

/*! @abstract A Boolean value indicating whether horizontal swipe gestures

will trigger back-forward list navigations.

@discussion The default value is NO.

*/

@property (nonatomic) BOOL allowsBackForwardNavigationGestures;

(自定義wkweb).allowsBackForwardNavigationGestures=YES;(UIWebview 沒這個方法)

NSHTTPCookieStorage和NSHttpCookie

NSHTTPCookieStorage 實現(xiàn)管理cookie的單利,每個cookie都是NSHTTPCookie類的實例僵朗,做為一個規(guī)則,cookie在所有應(yīng)用 之間共享并在不同進(jìn)程之間保持同步屑彻。Session cookie(一個isSessionOnly方法返回YES的cookie)只能在單一進(jìn)程中使用验庙。

WKWebView Cookie

NSURLCache和NSHTTPCookieStroage無法操作(WKWebView)WebCore進(jìn)程的緩存和Cookie

WKWebView實例將會忽略任何的默認(rèn)網(wǎng)絡(luò)存儲器(NSURLCache, NSHTTPCookieStorage, NSCredentialStorage) 和一些標(biāo)準(zhǔn)的自定義網(wǎng)絡(luò)請求類(NSURLProtocol,等等.).

WKWebView實例不會把Cookie存入到App標(biāo)準(zhǔn)的的Cookie容器(NSHTTPCookieStorage)中,因為 NSURLSession/NSURLConnection等網(wǎng)絡(luò)請求使用NSHTTPCookieStorage進(jìn)行訪問Cookie,所以不能訪問WKWebView的Cookie,現(xiàn)象就是WKWebView存了Cookie,其他的網(wǎng)絡(luò)類如NSURLSession/NSURLConnection卻看不到

與Cookie相同的情況就是WKWebView的緩存,憑據(jù)等。WKWebView都擁有自己的私有存儲,因此和標(biāo)準(zhǔn)cocoa網(wǎng)絡(luò)類兼容的不是那么好

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

同一個WKWebView 的Cookie是共享的社牲,但是同一個應(yīng)用中創(chuàng)建多個WKWebView
時粪薛,想要登錄等信息同步,就需要共享Cookie搏恤,這是一個辦法违寿。

WKWebView Cookie 讀取

找不到貼代碼的格式

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{

if (![ToolData sharedToolData].cookieArr) {

NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;

NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];

//讀取wkwebview中的cookie 方法 存儲起來? 等待注入時用

for (NSHTTPCookie *cookie in cookies) {

DLog(@"wkwebview中的cookie:%@", cookie);

NSArray *cookieArr = [NSArray arrayWithObjects:cookie.name, cookie.value,cookie.domain,cookie.path,nil];

[_cookieMutaArr addObject:cookieArr];

}

[ToolData sharedToolData].cookieArr = [_cookieMutaArr copy];

}

decisionHandler(WKNavigationResponsePolicyAllow);

}


WKWebView Cookie 寫入

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];

其中js的寫法問題,有可能有多個寫法是cookie之間用熟空;隔開藤巢。 NSString *jscontext = [NSString stringWithFormat:@"document.cookie ='%@=%@;domain=%@;path=%@;';",[ToolData sharedToolData].cookieArr[i][0],[ToolData sharedToolData].cookieArr[i][1],[ToolData sharedToolData].cookieArr[i][2],[ToolData sharedToolData].cookieArr[i][3]];


當(dāng)自己看不到時,可以打印息罗,也可以用抓包工具查看注入的cookie掂咒。其實上面的js注入方法,是在上圖的? Response Headers上面注入的迈喉,所以說 后期會有些問題绍刮,一般不建議這樣注入解決問題。會慢一拍挨摸。以下寫入請求頭解決這個問題

WKWebView Cookie 寫入到請求頭

NSMutableURLRequest *requset = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];

[requset addValue:_badyhead forHTTPHeaderField:@"Cookie"];

[self.wkbaseweb loadRequest:requset];

//以下是獲取Cookie 放到請求頭孩革,但要注意把 value值中的“;“去掉得运,否則沒有效果膝蜈,親試

{

_badyhead =[NSMutableString string];

for (int i = 0; i<[ToolData sharedToolData].cookieArr.count; i++) {

NSString *bady = [NSString stringWithFormat:@"%@=%@;",[ToolData sharedToolData].cookieArr[i][0],[ToolData sharedToolData].cookieArr[i][1]];

[_badyhead appendFormat:@"%@",bady];

}

[_badyhead deleteCharactersInRange:NSMakeRange(_badyhead.length - 1, 1)];

}


相關(guān)鏈接:

iOS開發(fā)-打通UIWebView和WKWebView的Cookie?

感謝博主天狐 我是參照他的寫出來的?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市熔掺,隨后出現(xiàn)的幾起案子彬檀,更是在濱河造成了極大的恐慌,老刑警劉巖瞬女,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窍帝,死亡現(xiàn)場離奇詭異,居然都是意外死亡诽偷,警方通過查閱死者的電腦和手機(jī)坤学,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門疯坤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人深浮,你說我怎么就攤上這事压怠。” “怎么了飞苇?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵菌瘫,是天一觀的道長。 經(jīng)常有香客問我布卡,道長雨让,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任忿等,我火速辦了婚禮栖忠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸街。我一直安慰自己庵寞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布薛匪。 她就那樣靜靜地躺著捐川,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逸尖。 梳的紋絲不亂的頭發(fā)上属拾,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音冷溶,去河邊找鬼渐白。 笑死,一個胖子當(dāng)著我的面吹牛逞频,可吹牛的內(nèi)容都是我干的纯衍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼苗胀,長吁一口氣:“原來是場噩夢啊……” “哼襟诸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起基协,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤歌亲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澜驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陷揪,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悍缠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卦绣。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖飞蚓,靈堂內(nèi)的尸體忽然破棺而出滤港,到底是詐尸還是另有隱情品山,我是刑警寧澤席吴,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站计露,受9級特大地震影響著榴,放射性物質(zhì)發(fā)生泄漏添履。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一兄渺、第九天 我趴在偏房一處隱蔽的房頂上張望缝龄。 院中可真熱鬧汰现,春花似錦挂谍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗅战,卻和暖如春妄田,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驮捍。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工疟呐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人东且。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓启具,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珊泳。 傳聞我的和親對象是個殘疾皇子鲁冯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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