iOS:项目中用到的Cookie
1、介绍:
做了这么长时间开发,Cookie真是用的不多,可是现在不一样了,这次的项目我用到了Cookie。其实,Cookie的使用在项目中愈加的频繁,一般情况下,提供的接口是用Cookie来识别用户信息的,所以需要在每次请求的时候附带上指定的Cookie,以及在登陆后保存Cookie。当然,也有将Token放在Cookie中,然后调用接口获取用户的敏感数据。
2、好处:
首先,Session是会过期的,所以存储再调用是没有任何意义的,更合适的做法是在获取到过期信息及时刷新Cookie。
其次,Cookie的管理和加载是系统本身已经做好的,如果自行保存和加载,反而累赘,就是你需要在很多地方去考虑要不要保存,要不要清除。
最后,AFN这个框架中就有专门对Cookie的处理,它会自动的将Cookie保存到本地,然后在发送请求时会自动调用本地的Cookie,快速高效,简单安全。
3、用的类:NSHTTPCookieStorage
AFN自己是不管理Cookie的,它使用的是Foundation底层的Cookie管理工具。
所有有关Cookie的设置和获取都可以通过这个类来实现。
当我们在使用AFN发送请求之前,手动设置了这个Cookie,在发送请求的时候就会把这段自动加到请求头信息中。(我猜应该是每次发送请求都会自动带上Cookie)
NSHTTPCookieStorage
NSHTTPCookieStorage单件类提供了管理所有NSHTTPCookie对象的接口,在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只当当前应用中有效。
通过sharedHTTPCookieStorage方法可获取到共享的NSHTTPCookieStorage单件对象。
+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;
使用NSHTTPCookieStorage单件对象可获取到当前存储的所有cookie
- (NSArray *)cookies
或针对特定URL的cookie
- (NSArray *)cookiesForURL:(NSURL *)theURL;
还可以添加/删除Cookie
– deleteCookie:
– setCookie:
– setCookies:forURL:mainDocumentURL:
通过NSHTTPCookieStorage可读取/修改cookie接收策略,默认为NSHTTPCookieAcceptPolicyAlways.
- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;
- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.
一共有三种cookie accept policy,
typedef enum {
NSHTTPCookieAcceptPolicyAlways,
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
}
NSHTTPCookieAcceptPolicy
;
NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默认策略.
NSHTTPCookieAcceptPolicyNever: 拒绝所有cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.
相关通知
NSHTTPCookieManagerCookiesChangedNotification
当NSHTTPCookieStorage实例中的cookies变化时发出此通知。
NSHTTPCookieManagerAcceptPolicyChangedNotification
当NSHTTPCookieStorage实例的cookie acceptance policy变化时发出此通知。
对于它的更多介绍:http://blog.csdn.net/chun799/article/details/17206907
4、保存和获取Cookie的方法(kCookie是一个字符串常量,作为保存/读取的Key值)
- 保存Cookie到本地
NSData * cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]]; NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject: cookiesData forKey:kCookie]; [defaults synchronize];
解释:上面这段代码的作用是保存当前Cookie到本地,我通常会在用户登录请求成功返回后调用这段代码将这次的Cookie进行保存,这样下次再发起其他的访问请求时候就可以取到这段Cookie
- 从本地获取Cookie
NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey:kCookie]]; NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in cookies){[cookieStorage setCookie: cookie]; }
解释:上段的代码实现的就是获取到本地的Cookie,然后设置CookieStorage,这样在下载请求时候就会自动带上这段Cookie。我是在每次请求发送之前执行这段代码。
5、扩展
- 事实上保存Cookie并不是仅仅在用户登录结束后执行的,比如在有图片验证码的时候,每次刷新图片验证码,也都是需要更新Cookie的(因为需要更新的Cookie里面的SessionID)。所以可以对外提供一个方法,这样在需要保存Cookie的时候调用方法就可以。至此Cookie问题解决,实测可以正常获取和传递Token等。(在我的项目中Cookie只是包含了SessionId,大家也可以根据需要往里面自由添加其他字段,毕竟Cookie已经取到了!)
- WebView加载链接加Cookie的方法,代码以及思路如下:
- 首先取到要加载的Cookie。我这里就是之前写的那堆保存在本地的,一个NSArray类型的东西,kCookie是常量(好像是第二次说了),就是保存和读取的Key值。
NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey:kCookie]];
- 然后启封NSHTTPCookieStorage,它有一个方法可以给指定URL加Cookie,大概是长下面这样:
NSHTTPCookieStorage * cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil];
- 解释:这里面有两个参数可以设置,cookies当然就是我们刚才取到的Cookie数组,url就是要加上Cookie的指定url,对我来说就是上面的@"酷炫网页的链接"。参数设置完毕,其他的就没问题啦!(什么?mainDocumentURL?这啥?不知道!填nil就可以了!)
- 总体代码:
NSString * urlStr = @"酷炫网页的链接"; NSURL * url = [NSURL URLWithString:urlStr]; NSArray * cookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey:kCookie]]; NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request];
6、Cookie使用范例:
1,获取cookie
获取cookie只能在请求中获取cookie,否则时获取不到的,url就不给出了,大家用自己的url测试一下就行。
获取到cookie后把cookie进行归档保存到userDefaults里
#pragma mark 获取并保存cookie到userDefaults - (void)getAndSaveCookie {NSLog(@"=============获取cookie==============");NSString *urlString = @"";//请求一个网址,即可分配到cookieAFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];manager.responseSerializer = [AFJSONResponseSerializer new];[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {//获取cookieNSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];for (NSHTTPCookie *tempCookie in cookies) {//打印获得的cookieNSLog(@"getCookie: %@", tempCookie);}/** 把cookie进行归档并转换为NSData类型* 注意:cookie不能直接转换为NSData类型,否则会引起崩溃。* 所以先进行归档处理,再转换为Data*/NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];//存储归档后的cookieNSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];[userDefaults setObject: cookiesData forKey: @"cookie"];NSLog(@"\n");[self deleteCookie];[self setCoookie];} failure:^(AFHTTPRequestOperation *operation, NSError *error) {nil;}]; }
2,删除cookie
把获取到的cookie删除掉,该步骤可以用在注销或者切换账号里。
当前,我这里删除cookie是为了检测后面的通过本地存储的数据进行设置cookie是否成功
#pragma mark 删除cookie - (void)deleteCookie {NSLog(@"============删除cookie===============");NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];//删除cookiefor (NSHTTPCookie *tempCookie in cookies) {[cookieStorage deleteCookie:tempCookie];}//把cookie打印出来,检测是否已经删除NSArray *cookiesAfterDelete = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];for (NSHTTPCookie *tempCookie in cookiesAfterDelete) {NSLog(@"cookieAfterDelete: %@", tempCookie);}NSLog(@"\n"); }
3,通过本地存储的数据设置cookie
把本地的cookie取出并反归档,设置到cookie中,并且检测cookie是否设置成功
#pragma mark 再取出保存的cookie重新设置cookie - (void)setCoookie {NSLog(@"============再取出保存的cookie重新设置cookie===============");//取出保存的cookieNSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];//对取出的cookie进行反归档处理NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"cookie"]];if (cookies) {NSLog(@"有cookie");//设置cookieNSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];for (id cookie in cookies) {[cookieStorage setCookie:(NSHTTPCookie *)cookie];}}else{NSLog(@"无cookie");}//打印cookie,检测是否成功设置了cookieNSArray *cookiesA = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];for (NSHTTPCookie *cookie in cookiesA) {NSLog(@"setCookie: %@", cookie);}NSLog(@"\n"); }
4、打印截图:
Demo:CookieText
7、我项目中用到的Cookie:
//1.创建请求管理对象AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",nil];//2.添加cookie[manager.requestSerializer setValue:[NSString stringWithFormat:@"token=%@",token] forHTTPHeaderField:@"Cookie"];//3.发送请求[manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {}];
引用博客:
Bear:http://blog.it985.com/11248.html
Zhang_yD:http://www.jianshu.com/p/5f52d2c6be7b
转载于:https://www.cnblogs.com/XYQ-208910/p/6075459.html
iOS:项目中用到的Cookie相关推荐
- iOS 项目中用到的一些开源库和第三方组件
iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有 ...
- iOS项目中用到的一些第三方库
今天来总结一下项目中用到的一些第三方库. 1. AFNetworking,在github上有3万多颗的星星,用作处理网络请求. 2. MZGuidePages, 这是一个小工具,用于创建首次使用app ...
- iOS项目组件化历程
为什么要组件化 随着业务的发展,App中的页面,网络请求,通用弹层UI,通用TableCell数量就会剧增,需求的开发人员数量也会逐渐增多. 如果所有业务都在同一个App中,并且同时开发人数较少时,抛 ...
- iOS 项目源码大全 github 国内外大神
github排名https://github.com/trending,github搜索:https://github.com/search 主要工作说明: 重新整理了Xcode好用的插件,信息更详细 ...
- iOS项目开发实战——开发基于Handoff的App(Swift)
iOS8推出一个新特性,叫做Handoff.Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行.这个在iOS8 ...
- iOS 请求头第二次cookie中获取不到PHPSESSID的问题
iOS 请求头第二次cookie中获取不到PHPSESSID的问题 最近在项目中让我遇到了一个很蛋疼的问题,我们的App中混合的有H5的界面,但是H5页面也需要对登录信息进行验证.于是我们就用了coo ...
- iOS项目的本地化处理(多国语言)
项目的本地化就是:iOS系统在不同语言环境下自动切换语言,从而实现一个app发布到全世界各个国家的AppStore上. 我们不仅仅需要在iOS项目中做本地化处理,在上架iOS APP的时候,也需要做对 ...
- iOS 项目集成Flutter
#最近移动端火爆无非是Flutter--舍我其谁,而官网的引导之中鲜有说怎么在已有项目中去集成Flutter,今天我们就再蹭个热门来进行一个iOS集成 1 创建iOS项目(做测试使用) 2 cocoa ...
- 创建第一个IOS项目
今天我们创建第一个IOS项目,并在模拟器上运行 首先进入Xcode 点击创建新项目后,接下来该给项目起一个名字啦 HelloWorld! 点击下一步,开始选择模板啦 我们选择SingleView Ap ...
最新文章
- 局部响应归一化(Local Response Normalization)
- AI芯片大战已然打响,国内外巨头抢占万亿智能家居市场
- BlockChain:《世界经济论坛:区块链将如何重塑金融业?》—20160812—听课笔记
- 点到直线的距离c语言程序,点到线段的距离 题解(C++)
- ThinkPHP RBAC官网的例子详解
- 使用PL/SQL删除百万条记录的大表
- Python 爬虫逆向破解案例实战 (二):STEAM密码加密 (RSA) 逆向
- mysql商品表_MySQL数据库创建商品表
- NBA球员数据的爬取
- Linux动态库依赖其它动态库的问题
- matlab 采样点数,信号频率、采样频率、采样点数
- 创建视图簇SE54并SE93赋予事务代码
- 欧莱雅的矿物质粉今天去买回来了
- IOS开发—— 获取AppDelegate的属性或字段
- ua解析接口_VIP电影解析接口(80个)
- darknet框架基于resnet34模型训练OCT图片
- 【Verilog】32位单精度浮点数比较大小
- 蛋白质序列处理,只保存蛋白质序列,而不存ID等
- Vertica 向 GBase8a 迁移指南之数据类型迁移
- 我的2020,一个初创者的自述与思考