iOS平台下cookie的使用

首先,先介绍下iOS对cookie的操作的两个类:

帖子来源于:http://blog.csdn.net/chun799/article/details/17206907

1. NSHTTPCookie  2. NSHTTPCookieStorage

NSHTTPCookie对象代表一个HTTP cookie。 这是一个不可改变的对象,从一个包含cookie的属性的字典初始化,这个类可以用来手动创建cookie的Properties 。

- (NSUInteger)version;

- (NSString *)name;

- (NSString *)value;

- (NSString *)domain;

- (NSString *)path;

- (BOOL)isSessionOnly;等等属性,具体属性请自行谷歌

可以通过手工赋值的方式创建Cookie,如

+ (id)cookieWithProperties:(NSDictionary *)properties;

- (id)initWithProperties:(NSDictionary *)properties;

也可以从Cookie中读取到所有属性。

- (NSDictionary *)properties;

使用NSHTTPCookie的类方法可以将NSHTTPCookie实例与HTTP cookie header相互转换.

根据NSHTTPCookie实例数组生成对应的HTTP cookie header

+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

从headerFileds中读取到Cookie相关内容,生成NSHTTPCookie实例对象数组。

+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)theURL;

该方法会忽略headerFileds中与cookie无关的字段,如果headerFileds中的cookie没有指定domain,则使用theURL的domain,如果没有指定path,则使用”/”.

除非NSURLRequest明确指定不使用cookie(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。从NSURLResponse返回的cookie也会根据当前的cookie访问策略(cookie acceptance policy)接收到系统中。

例如:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];  // 创建cookie属性字典

[cookieProperties setObject:@"username" forKey:NSHTTPCookieName]; // 手动设置cookie的属性

[cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];

[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];  // 通过NSHTTPCookie的cookieWithProperties方法,将属性字典传入进行初始化,对象返回的是一个NSHTTPCookie对象,创建完成后进行下一步操作:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];  // 将手动创建返回的NSHTTPCookie对象添加到NSHTTPCookieStorage中,在iOS中使用NSHTTPCookie类封装一条cookie,通过NSHTTPCookie的方法读取到cookie的通用属性。在此声明一点:如果你的request里面明确不使用cookie,那么要讲cookie的(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储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变化时发出此通知。

参考:

NSHTTPCookieStorage Class Reference

NSHTTPCookie Class Reference

URL Loading System Programming Guide – Cookie Storage

以上是对这两个类的综合介绍,如果有不懂,请自行百度或谷歌。

正文

说了这么多,就来写下我项目中用到的cookie管理

我这个操作是保存NSHTTPCookieStorage对象里的所有cookie,当然也可以使用cookieForUrl来获取cookie进行保存,方便后续的使用。此操作是在登录的时候进行。

下面:

 这个方法就是更新cookie。在程序每次启动的时候调用一下。用来确保每次的cookie是最新的。

然后:

 这个方法就是移除你保存的cookie了。因为你在退出账户的时候需要重新获取新的cookie,所以,你需要在退出账户的时候清空你上次保存的cookie.   大概就是这么多操作

staticNSString*kLocalCookieName =@"MyProjectCookie";

staticNSString*kLocalUserData =@"MyProjectLocalUser";

staticNSString*kServerSessionCookie =@"JSESSIONID";

最后

写的不好,也没排版,请见谅。

iOS平台下cookie的使用的更多相关文章

  1. node.js平台下,利用cookie实现记住密码登陆(Express+Ejs+Mysql)

    本博文需有node.js+express+mysql入门基础,若基础薄弱,可参考博主的其他几篇node.就是博文: 1.下载Mysql数据库,安装并配置 创建用户表供登录使用: 2.node.js平台 ...

  2. Android平台下OpenCV移植与使用---基于C/C++

    在<Android Studio增加NDK代码编译支持--Mac环境>和<Mac平台下Opencv开发环境搭建>两篇文章中,介绍了如何使用NDK环境和Opencv环境搭建与测试 ...

  3. [修正] Firemonkey Windows & macOS 平台下 Edit & Memo 中文输入后会取消原选取文字的 BUG

    问题:Firemonkey Windows & macOS 平台下 Edit & Memo 中文输入后会取消原选取文字的 BUG 适用版本:Delphi 10.1.2 & 10 ...

  4. Android平台下Dalvik层hook框架ddi的研究

    通过adbi,可以对native层的所有代码进行hook.但对于Android系统来说,这还远远不够,因为很多应用都还是在Dalvik虚拟机中运行的. 那么,有没有什么办法可以对Dalvik虚拟机中跑 ...

  5. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  6. Windows平台下Git服务器搭建

    第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...

  7. Windows平台下PHP开发环境的配置

    Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...

  8. Mac平台与Windows平台下AndroidStudio增量升级

    Android Studio增量升级什么情况下使用最合适呢? 比如现在的as版本是2.2版本,而你的as版本2.0版本,这个时候点Check For Updates就没有反应了,因为你已经2个有版本没 ...

  9. win7平台下React-Native Android:Unable to upload some APKs

    一.问题描述 根据网络上的Win7平台下React-native配置教程配置好开发环境的过程中,在艰难进行到react-native run-android这一步时,发现一直出现错误,截图如下: 错误 ...

随机推荐

  1. 解决sql2008连接数据库,无法为该请求检索数据,错误916

    通常在使用sql server management studio 2008 连接数据库,可以链接上,但是无法查看自己的数据库,点击数据库或刷新数据库列表后,提示:无法为该请求检索数据,错误916,如 ...

  2. JS 无提示关闭当前窗口

    function teseClose() { window.opener = null; window.open('','_self'); window.close(); }

  3. oracle服务开机自启动

    1.修改oracle系统配置文件::/etc/oratab vi /etc/oratab orcl:/opt/oracle/product/10.2.0/db_1:Y 2.在 /etc/init.d/ ...

  4. 2015版Force Touch Mac Book激活三个手指拖动窗口

    新买的2015版的Mac Book Pro,一切都好,就是原来一直很的很习惯的三个手指拖动窗口的手势,突然找不到地方设置了,很是让我失望了一把,在想苹果怎么会把这么有用的手势去掉了呢.还好有万能的Go ...

  5. Fedora22没有i18n文件

    今天想修改Fedora22的系统语言,发现/etc/sysconfig/没有i18n 解决方法: dnf install system-config-language.noarch -y system ...

  6. python 查看插件命令 pip freeze 以及django3.4链接mysql

    https://github.com/PyMySQL/PyMySQL/issues/244 pip freeze命令可以显示python插件版本 MySQLdb只支持Python2.*,还不支持3.* ...

  7. Typecho中文验证码Captcha插件

    前言实在是受不了每天都要删除掉上百条的垃圾评论,干脆自己做了个验证码插件,顺带做的完善了些,分享给大家. 本插件是在评论验证码插件基础上完善而来.所不同的是,采用了最新的securimage 3.0. ...

  8. python之6-2高阶函数

    1. map函数 map(函数A,字符串或者列表) map函数的意思是将函数A依次作用到字符串的每个字符或者列表的每个元素. 例如: map(lambda x: x*x,[1,2]) [1, 4] 这 ...

  9. jQuery的Autocomplete插件的远程url取json数据的问题

    关于远程返回的json数据的展示,以前一样的代码,如果是本地写好的json串数据,插件显示就没有问题,一旦换成ulr方式读取一样的数据,插件就不能正常显示问题了. 今天偶然搜索资料找到一篇csdn上有 ...

  10. 使用POI把Word Excel转为HTML

    此方法是针对Office2003的,但是word中如果有图片,图片能够解析出来但是HTML文件中不显示.也不支持excel中的图片解析. 所需jar包如下如下: 1:PoiUtil.java pack ...