UIWebView的Cookie管理
Cookie簡介
說到Cookie,或許有些小伙伴會(huì)比較陌生,有些小伙伴會(huì)比較熟悉。如果項(xiàng)目中,所有頁面都是純?cè)鷣韺?shí)現(xiàn)的話,一般Cookie這個(gè)東西或許我們永遠(yuǎn)也不會(huì)接觸到。但是,這里還是要說一下Cookie,因?yàn)樗娴暮苤匾?,由它產(chǎn)生的一些坑也很多。
Cookie在Web利用的最多的地方,是用來記錄各種狀態(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管理
UIWebView的Cookie管理很簡單,一般不需要我們手動(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,并添加到request的header中
//Cookies數(shù)組轉(zhuǎn)換為requestHeaderFields
NSDictionary *requestHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
//設(shè)置請(qǐng)求頭
request.allHTTPHeaderFields = requestHeaderFields;
整體來說UIWebView的Cookie管理比較簡單,小伙伴們可以自己寫個(gè)demo測(cè)試一下,發(fā)揮你們的想象。