UIWebView的Cookie管理
Cookie简介
说到Cookie
,或许有些小伙伴会比较陌生,有些小伙伴会比较熟悉。如果项目中,所有页面都是纯原生来实现的话,一般Cookie
这个东西或许我们永远也不会接触到。但是,这里还是要说一下Cookie
,因为它真的很重要,由它产生的一些坑也很多。
Cookie
在Web
利用的最多的地方,是用来记录各种状态。
比如你在Safari中打开百度,然后登陆自己的账号,之后打开所有百度相关的页面,都会是登陆状态,而且当你关了电脑,下次开机再次打开Safari
打开百度,会发现还是登陆状态,其实这个就利用了Cookie
。Cookie
中记录了你百度账号的一些信息、有效期等,也维持了跨域请求时登录状态的统计性。
在App
中,Cookie
最常用的就是维持登录状态了。一般Native端都有自己的一套完整登录注册逻辑,一般大部分页面都是原生实现的。当然,也会有一些页面是h5来实现的,虽然h5页面在App
中通过WebView
加载或多或少都会有点性能问题,感觉不流畅或者体验不好,但是它的灵活性是Native App
无法比拟的。那么由此,便产生了一种需求,当Native端用户是登录状态的,打开一个h5页面,h5也要维持用户的登录状态。
这个需求看似简单,如何实现呢?
一般的解决方案是Native保存登录状态的Cookie,在打开h5页面中,把Cookie添加上,以此来维持登录状态。其实坑还是有很多的,比如:
(1)用户登录或者退出了,h5页面的登录状态也变了,需要刷新,什么时候刷新?
(2)WKWebView中Cookie丢失问题?
Cookie管理
UIWebView
的Cookie
管理很简单,一般不需要我们手动操作Cookie,因为所有Cookie都会[NSHTTPCookieStorage sharedHTTPCookieStorage]
这个单例管理,而且UIWebView
会自动同步CookieStorage
中的Cookie
,所以只要我们在Native端,正常登陆退出,h5在适当时候刷新,就可以正确的维持登录状态,不需要做多余的操作。
可能有一些情况下,我们需要在访问某个链接时,添加一个固定Cookie
用来做区分,那么就可以通过header
来实现
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[request addValue:@"customCookieName=1314521;" forHTTPHeaderField:@"Set-Cookie"];
[self.webView loadRequest:request];
也可以主动操作NSHTTPCookieStorage
,添加一个自定义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
转换成HTTPHeaderFields
,并添加到request
的header
中
//Cookies数组转换为requestHeaderFields
NSDictionary *requestHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
//设置请求头
request.allHTTPHeaderFields = requestHeaderFields;
整体来说UIWebView
的Cookie
管理比较简单,小伙伴们可以自己写个demo
测试一下,发挥你们的想象。