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相关推荐

  1. iOS 项目中用到的一些开源库和第三方组件

    iOS 项目中用到的一些 iOS 开源库和第三方组件 分享一下我目前所在公司 iOS 项目中用到的一些 iOS 开源库和第三方组件, 感谢开源, 减少了我们的劳动力, 节约了我们大量的时间, 让我们有 ...

  2. iOS项目中用到的一些第三方库

    今天来总结一下项目中用到的一些第三方库. 1. AFNetworking,在github上有3万多颗的星星,用作处理网络请求. 2. MZGuidePages, 这是一个小工具,用于创建首次使用app ...

  3. iOS项目组件化历程

    为什么要组件化 随着业务的发展,App中的页面,网络请求,通用弹层UI,通用TableCell数量就会剧增,需求的开发人员数量也会逐渐增多. 如果所有业务都在同一个App中,并且同时开发人数较少时,抛 ...

  4. iOS 项目源码大全 github 国内外大神

    github排名https://github.com/trending,github搜索:https://github.com/search 主要工作说明: 重新整理了Xcode好用的插件,信息更详细 ...

  5. iOS项目开发实战——开发基于Handoff的App(Swift)

    iOS8推出一个新特性,叫做Handoff.Handoff中文含义为换手(把接力棒传给下一个人),可以在一台Mac和iOS设备上开始工作,中途将工作交换到另一个Mac或iOS设备中进行.这个在iOS8 ...

  6. iOS 请求头第二次cookie中获取不到PHPSESSID的问题

    iOS 请求头第二次cookie中获取不到PHPSESSID的问题 最近在项目中让我遇到了一个很蛋疼的问题,我们的App中混合的有H5的界面,但是H5页面也需要对登录信息进行验证.于是我们就用了coo ...

  7. iOS项目的本地化处理(多国语言)

    项目的本地化就是:iOS系统在不同语言环境下自动切换语言,从而实现一个app发布到全世界各个国家的AppStore上. 我们不仅仅需要在iOS项目中做本地化处理,在上架iOS APP的时候,也需要做对 ...

  8. iOS 项目集成Flutter

    #最近移动端火爆无非是Flutter--舍我其谁,而官网的引导之中鲜有说怎么在已有项目中去集成Flutter,今天我们就再蹭个热门来进行一个iOS集成 1 创建iOS项目(做测试使用) 2 cocoa ...

  9. 创建第一个IOS项目

    今天我们创建第一个IOS项目,并在模拟器上运行 首先进入Xcode 点击创建新项目后,接下来该给项目起一个名字啦 HelloWorld! 点击下一步,开始选择模板啦 我们选择SingleView Ap ...

最新文章

  1. 局部响应归一化(Local Response Normalization)
  2. AI芯片大战已然打响,国内外巨头抢占万亿智能家居市场
  3. BlockChain:《世界经济论坛:区块链将如何重塑金融业?》—20160812—听课笔记
  4. 点到直线的距离c语言程序,点到线段的距离 题解(C++)
  5. ThinkPHP RBAC官网的例子详解
  6. 使用PL/SQL删除百万条记录的大表
  7. Python 爬虫逆向破解案例实战 (二):STEAM密码加密 (RSA) 逆向
  8. mysql商品表_MySQL数据库创建商品表
  9. NBA球员数据的爬取
  10. Linux动态库依赖其它动态库的问题
  11. matlab 采样点数,信号频率、采样频率、采样点数
  12. 创建视图簇SE54并SE93赋予事务代码
  13. 欧莱雅的矿物质粉今天去买回来了
  14. IOS开发—— 获取AppDelegate的属性或字段
  15. ua解析接口_VIP电影解析接口(80个)
  16. darknet框架基于resnet34模型训练OCT图片
  17. 【Verilog】32位单精度浮点数比较大小
  18. 蛋白质序列处理,只保存蛋白质序列,而不存ID等
  19. Vertica 向 GBase8a 迁移指南之数据类型迁移
  20. 我的2020,一个初创者的自述与思考

热门文章

  1. 【Android学习】自定义Android样式checkbox
  2. 查看sqlserver版本
  3. sjms-4 行为型模式
  4. 二叉树已知先序和中序输出后序
  5. Serverless 工程实践 | 自建 Apache OpenWhisk 平台
  6. 以阿里云RPA为例,来告诉你到底RPA是什么?
  7. 更效率、更优雅 | 阿里巴巴开发者工具不完全盘点
  8. k8s包管理器helm_eShopOnContainers 知多少[10]:部署到 K8S | AKS
  9. 网游类似魔兽世界的服务器维护都是在干嘛?
  10. 游戏中常用的寻路算法的分享(4)处理移动中的障碍物