UIWebView的Cookie 管理

參考文章

UIWebView的Cookie管理

Cookie簡介

說到Cookie,或許有些小伙伴會(huì)比較陌生,有些小伙伴會(huì)比較熟悉。如果項(xiàng)目中,所有頁面都是純?cè)鷣韺?shí)現(xiàn)的話,一般Cookie這個(gè)東西或許我們永遠(yuǎn)也不會(huì)接觸到。但是,這里還是要說一下Cookie,因?yàn)樗娴暮苤匾?,由它產(chǎn)生的一些坑也很多。

CookieWeb利用的最多的地方,是用來記錄各種狀態(tài)。

比如你在Safari中打開百度,然后登陸自己的賬號(hào),之后打開所有百度相關(guān)的頁面,都會(huì)是登陸狀態(tài),而且當(dāng)你關(guān)了電腦,下次開機(jī)再次打開Safari打開百度,會(huì)發(fā)現(xiàn)還是登陸狀態(tài),其實(shí)這個(gè)就利用了Cookie。Cookie中記錄了你百度賬號(hào)的一些信息、有效期等,也維持了跨域請(qǐng)求時(shí)登錄狀態(tài)的統(tǒng)計(jì)性。

App中,Cookie最常用的就是維持登錄狀態(tài)了。一般Native端都有自己的一套完整登錄注冊(cè)邏輯,一般大部分頁面都是原生實(shí)現(xiàn)的。當(dāng)然,也會(huì)有一些頁面是h5來實(shí)現(xiàn)的,雖然h5頁面在App中通過WebView加載或多或少都會(huì)有點(diǎn)性能問題,感覺不流暢或者體驗(yàn)不好,但是它的靈活性是Native App無法比擬的。那么由此,便產(chǎn)生了一種需求,當(dāng)Native端用戶是登錄狀態(tài)的,打開一個(gè)h5頁面,h5也要維持用戶的登錄狀態(tài)。

這個(gè)需求看似簡單,如何實(shí)現(xiàn)呢?
一般的解決方案是Native保存登錄狀態(tài)的Cookie,在打開h5頁面中,把Cookie添加上,以此來維持登錄狀態(tài)。其實(shí)坑還是有很多的,比如:
(1)用戶登錄或者退出了,h5頁面的登錄狀態(tài)也變了,需要刷新,什么時(shí)候刷新?
(2)WKWebView中Cookie丟失問題?



Cookie管理

UIWebViewCookie管理很簡單,一般不需要我們手動(dòng)操作Cookie,因?yàn)樗蠧ookie都會(huì)[NSHTTPCookieStorage sharedHTTPCookieStorage]這個(gè)單例管理,而且UIWebView會(huì)自動(dòng)同步CookieStorage中的Cookie,所以只要我們?cè)贜ative端,正常登陸退出,h5在適當(dāng)時(shí)候刷新,就可以正確的維持登錄狀態(tài),不需要做多余的操作。

可能有一些情況下,我們需要在訪問某個(gè)鏈接時(shí),添加一個(gè)固定Cookie用來做區(qū)分,那么就可以通過header來實(shí)現(xiàn)

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[request addValue:@"customCookieName=1314521;" forHTTPHeaderField:@"Set-Cookie"];
[self.webView loadRequest:request];

也可以主動(dòng)操作NSHTTPCookieStorage,添加一個(gè)自定義Cookie

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{
    NSHTTPCookieName: @"customCookieName", 
    NSHTTPCookieValue: @"1314521", 
    NSHTTPCookieDomain: @".baidu.com",
    NSHTTPCookiePath: @"/"
}];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];   //Cookie存在則覆蓋,不存在添加

還有一些常用的方法,如讀取所有Cookie

NSArray *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;

Cookie轉(zhuǎn)換成HTTPHeaderFields,并添加到requestheader

//Cookies數(shù)組轉(zhuǎn)換為requestHeaderFields
NSDictionary *requestHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
//設(shè)置請(qǐng)求頭
request.allHTTPHeaderFields = requestHeaderFields;

整體來說UIWebViewCookie管理比較簡單,小伙伴們可以自己寫個(gè)demo測(cè)試一下,發(fā)揮你們的想象。

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

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

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