平常的app开发中只调用Rest Api可能用不到Cookie,但是当要在App中内嵌WebView就有可能要用到。最近用到了这一块的东西,总结一下。

Cookie原理

关于cookie的原理简单描述就是下图:

server通过Set-Cookie或者Set-Cookie2来告诉浏览器存储cookie,然后在后续请求(通过domain和path来判断是否应该包含在某个请求中)中传回服务器。cookie可以分为会话cookie和持久cookie。会话cookie在浏览器关掉之后就会清除,而持久cookie会被存储在磁盘上,通过有效期来管理其生命周期。详情可以参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

HTTPCookie对象(OC中的类名叫NSHTTPCookie)

HTTPCookie对象是iOS中用来描述cookie信息的。有如下属性:

var domain: String   Cookie所属的domain
var expiresDate: Date? Cookie的过期时间
var isHTTPOnly: Bool 用来标示Cookie是否只允许通过Http请求携带,而不能通过javascript获取到。
var isSecure: Bool 用来标示cookie是否必须通过https请求传输
var isSessionOnly: Bool 用来标示cookie是否属于会话cookie
var name: String cookie的名字
var path: String cookie所应用的url path,指定之后只有指定url path的请求系统才会携带该cookie(/表示全部路径)
var value: String cookie的值
var version: Int cookie的版本(cookie目前一共有两个版本,因此此处的合法值为0或1)

HTTPCookie对象可以通过提供属性字典的方式创建,Foundation库提供了名为HTTPCookiePropertyKey的枚举来定义可以出现在属性字典中的key.

init?(properties: [HTTPCookiePropertyKey : Any])

HTTPCookieStorage对象        

在浏览器中访问网页时,浏览器负责管理cookie。而在App中我们通过UrlSession和UrlConnection发送网络请求时,底层的网络层也会自动的为我们管理cookie:从response中解析cookie缓存和从缓存自动取出对应cookie填充到UrlRequest对象中。 而HTTPCookieStorage对象则是负责存储cookie的地方。HTTPCookieStorage是系统提供的一个单例对象。它提供存取系统中cookie的接口。

当我们发送网络请求后,如果后台在Response中添加了cookie信息。当我们收到Response后,我们应该可以通过访问HttpCookieStorage.shared.cookies属性拿到后台添加的cookie信息。(在某些情况下不是这样的,后面会说明)

我们也可以通过HttpCookieStorage.shared.SetCookie接口来添加cookie对象到storage中。cookie被添加到HttpCookieStorage后当对应domain和path的请求被发送时(UrlSession或UIWebView请求都是可以的),该cookie就会被自动包含在UrlRequest中。

HttpCookieStorage对象还包含了清除cookie等接口,详情见https://developer.apple.com/documentation/foundation/httpcookiestorage

UrlSessionConfiguration中的Storage对象

上面说到的可以通过HttpCookieStorage.shared.cookies来访问后台添加的cookie信息在如下情况下会有问题:使用通过NSURLSessionConfiguration.ephemeralSessionConfiguration来构造的UrlSession来发送的请求。

原因是ephemeralSessionConfiguration默认时候的CookieStorage是私有的CookieStorage对象,而不是前面所说的HttpCookieStorage单例对象。因此通过这种UrlSession收到的cookie都被其私有的CookieStorage所存储,也就不能被共享了(通过改UrlSession对象发送的请求是共享的)。要实现这种UrlSession对象的cookie也能存储在HTTPCookieStorage单例对象的方法也很简单。只需要我们在创建UrlSession对象时修改UrlSessionConfiguration对象的HTTPCookieStorage属性即可。

var config = URLSessionConfiguration.ephemeralSessionConfiguration
config.HTTPCookieStorage = HTTPCookieStorage.shared
var session = UrlSession(configuration:config);

不跨进程              

iOS系统对cookie的跨进程共享做了限制。看官方文档:

Each cookie is represented by an instance of the HTTPCookie class. As a rule, cookies are shared among all applications and are kept in sync across process boundaries. Session cookies (where the cookie object’s isSessionOnly method returns true) are local to a single process and are not shared.

iOS Note

Cookies are not shared among applications in iOS.





iOS中Cookie的管理的更多相关文章

  1. JavaWeb中Cookie会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  2. iOS中事件传递过程

    iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...

  3. iOS之Cookie

    iOS之Cookie使用 简介 概念:Cookie中文名称叫做"小型文本文件",指某些网站为了辨别用户身份而存储在用户本地终端上的数据(通常经过加 密). Web服务器可以用过Se ...

  4. iOS 如何在一个已经存在多个project的workspace中引入cocoapods管理第三方类库

    一种新的第三方库管理工具:Carthage 如何使用Carthage管理iOS依赖库 Podfile Syntax Reference v1.1.0.rc.3 https://guides.cocoa ...

  5. iOS:iOS中的多控制器管理

    iOS中的控制器有三种创建方式: 1.通过storyboard创建 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@" ...

  6. IOS - 打印COOKIE中的 CRFSToken

    NSHTTPCookie 在iOS中使用NSHTTPCookie类封装一条cookie,通过NSHTTPCookie的方法读取到cookie的通用属性. - (NSUInteger)version; ...

  7. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  8. IOS中http请求使用cookie

    http://rainbird.blog.51cto.com/211214/805173 IOS中http请求使用cookie 2012-03-13 23:04:30 标签:http 记录 龙的传人  ...

  9. ios 中局部变量可以通过传递来进行管理和释放,借此可提高代码的內聚度

    ios 中 局部变量可以通过传递来进行管理和释放,通过多使用局部变量,可以提高代码的內聚度.如下: -(void)someMethod { UILabel *label = [[UILabel al ...

随机推荐

  1. Spoj-COINS-记忆化dp

    COINS - Bytelandian gold coins #dynamic-programming In Byteland they have a very strange monetary sy ...

  2. 玲珑oj 1121 思维

    1121 - Reverse the lights Time Limit:2s Memory Limit:256MByte Submissions:376Solved:111 DESCRIPTION ...

  3. jquery基础 笔记一

    一. 1. vsdoc: 在Visual Studio中需要引入此版本的jquery类库才能启用智能感知.如:jquery-1.3.2-vsdoc2.js<body> <div id ...

  4. USB events thread - failed to set priority

    ubuntu + openni + nite,出现 Warning:USB events thread - failed to set priority xn::ImageGenerator imag ...

  5. 【html5】hashchange Event – 监测URL的hash变化

    通过URL传值,在?后附加以=连接的键值对,各键值对间以&连接:也可以通过URL传递页面参数,在”#”后附加的方式.两者最大的一个 区别在于:后者不会发起请求,不会导致页面刷新.常见应用场景在 ...

  6. linux basename学习

    basename 用法 basename 名称 [后缀]   例子 1. $: basename /tmp/test.sh 输出: test.sh 2. $: basename /tmp/test.s ...

  7. Sql Server- 性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON

    1.前言 对于优化SQL语句或存储过程,以前主要是用如下语句来判断具体执行时间,但是SQL环境是复杂多变的,下面语句并不能精准判断性能是否提高:如果需要精确知道CPU.IO等信息,就无能为力了. 1 ...

  8. Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现

    一.安装 ubuntu中sendmail函数可以很方便的发送邮件,ubuntu sendmail先要安装两个包. 必需安装的两个包: 代码  sudo apt-get install sendmail ...

  9. jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?

    在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况,在此将通用的处理方法小结如下: java变量传给js好办,var a=”<%=javaParam%>“ ...

  10. (转)MapReduce Design Patterns(chapter 3 (part 1))(五)

    Chapter 3. Filtering Patterns 本章的模式有一个共同点:不会改变原来的记录.这种模式是找到一个数据的子集,或者更小,例如取前十条,或者很大,例如结果去重.这种过滤器模式跟前 ...