cookie:其实相当于服务端给我们的一个临时身份令牌,当我们登录的时候,携带的帐号、密码等信息服务器收到之后,就会给你这个令牌,以后你要访问服务端的数据的时候,只要拿着这个令牌去就可以访问到服务端端数据了(到这里你肯定会疑问,我怎么好像没有设置这个cookie令牌,登录成功了后面的功能都可以操作了,其实这个步骤iOS系统以及为我们做了,在登录成功之后,系统会把返回的cookie令牌保存起来,当你操做app其他功能的时候,系统会自动把cookie添加到请求头里面去的,所有你才能操作成功,但是问题来了,这个身份令牌是iOS系统保存的,它有个过期时间,过期了之后,发送网络请求的时候是不会带在请求头里面的,这时候你再去操作的时候,服务端找不到你的令牌,所有的功能都会出现问题,怎么解决后面篇讲解)。
苹果文档翻译内容:
由于HTTP协议的无状态性,客户端通常使用的持久化存储数据都是来自于携带cookies的URL网络请求(系统默认会每次在发送网络请求的时候在请求头里面设置cookie,我们通常没有管理他,通过Charles软件抓包可以明显的看到请求头里面多了个Set-cookie 参数)。URL Loading System 提供了接口来创建管理cookies,提供了将cookie作为HTTP请求的一部分发送的接口(系统默认也会去取cookie,也可以手动设置cookie,还可以设置让系统不默认发送cookie),同时也提供了接口来接收cookie党web服务器响应之后(在响应头里面会有个Set-cookie字段,对应的值是服务端设置之后反回来的cookie)。
NSHTTPCookie类概括了cookie ,这类提供了访问器来访问cookie的很多特性(attributes),提供了从HTTP cookie头转换到NSHTTPCookie实例对象的方法,同时也提供了从NSHTTPCookie 实例到NSURLResquest 对象请求头的方法。URL loading system 会为NSURLResquest对象自动发送任何合适的cookie(每个url 请求都会返回cookie,系统自动保存起来的,当你发送请求的时候,系统会自动根据对应的url 找到以前请求过保存起来的cookie,然后放在请求头里面发送给服务端,注意这个系统保存的cookie会过期的,过期之后请求头里面是不会设置cookie信息的,这会导致应用的很多功能出现不知所以的问题(主要是看后台那边怎么验证的,如果对应的功能接口需要保证请求头里面有cookie的信息的话,app的功能使用就会出现问题)),除非你表明不发送cookie,否则系统都会默认去获取cookie并发送,同时,cookie会在被返回的NSURLResponse对象里面,当然了,这个cookie是否被接受依赖于设置的cookie接收策略。
该NSHTTPCookieStorage类提供用于管理所有应用程序共享NSHTTPCookie对象集合的接口(所有通过它的到的cookies是所有应用的,但是在iOS app中是不共享的)。
NSHTTPCookieStorage类允许应用设置cookie接收策略,这个策略控制是否cookie总是被接收、从不接收,或者特定域名的。
注意:在一个app里面改变了cookie的接收策略会影响其他所有的正在运行的app的cookie 接收策略。(NSHTTPCookieStorage类 是跨越app的)。
当其他的app修改了cookie 存储或者接收策略之后,NSHTTPCookieStorage类会通过发送NSHTTPCookieManagerCookiesChangedNotification和NSHTTPCookieStorageAcceptPolicyChangedNotification通知 来通知app。
后面篇讲解cookie身份令牌过期导致应用功能失效问题的解决方案