UIWebView的Cookie 管理

参考文章

UIWebView的Cookie管理

Cookie简介

说到Cookie,或许有些小伙伴会比较陌生,有些小伙伴会比较熟悉。如果项目中,所有页面都是纯原生来实现的话,一般Cookie这个东西或许我们永远也不会接触到。但是,这里还是要说一下Cookie,因为它真的很重要,由它产生的一些坑也很多。

CookieWeb利用的最多的地方,是用来记录各种状态。

比如你在Safari中打开百度,然后登陆自己的账号,之后打开所有百度相关的页面,都会是登陆状态,而且当你关了电脑,下次开机再次打开Safari打开百度,会发现还是登陆状态,其实这个就利用了CookieCookie中记录了你百度账号的一些信息、有效期等,也维持了跨域请求时登录状态的统计性。

App中,Cookie最常用的就是维持登录状态了。一般Native端都有自己的一套完整登录注册逻辑,一般大部分页面都是原生实现的。当然,也会有一些页面是h5来实现的,虽然h5页面在App中通过WebView加载或多或少都会有点性能问题,感觉不流畅或者体验不好,但是它的灵活性是Native App无法比拟的。那么由此,便产生了一种需求,当Native端用户是登录状态的,打开一个h5页面,h5也要维持用户的登录状态。

这个需求看似简单,如何实现呢?
一般的解决方案是Native保存登录状态的Cookie,在打开h5页面中,把Cookie添加上,以此来维持登录状态。其实坑还是有很多的,比如:
(1)用户登录或者退出了,h5页面的登录状态也变了,需要刷新,什么时候刷新?
(2)WKWebView中Cookie丢失问题?



Cookie管理

UIWebViewCookie管理很简单,一般不需要我们手动操作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,并添加到requestheader

//Cookies数组转换为requestHeaderFields
NSDictionary *requestHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
//设置请求头
request.allHTTPHeaderFields = requestHeaderFields;

整体来说UIWebViewCookie管理比较简单,小伙伴们可以自己写个demo测试一下,发挥你们的想象。

你可能感兴趣的:(UIWebView的Cookie 管理)