今天无意间翻到了以前有关 cookies 的代码,就顺便整理了一下,和大家分享下。
Cookies 简介
这里有比较详细的介绍,本文就不再赘述了。click me
在 iOS 当中需要注意以下几点:
- 不管是 NSURLConnection 还是 UIWebView 都会保留并传递服务端的 cookie,就是说基本所有的网络请求都会使用 cookie
- 多个应用之间默认不共享 cookie
- 临时 cookie 在应用重启之后就会消失
- 持久 cookie 在应用或系统重启之后不会消失
- cookie 不能跨域,像.baidu.com 和 image.baidu.com 这种也是跨域
- WKWebView 因为没有缓存,不能使用 cookie,想要使用,需做特殊处理。
注:cookie 不能跨域是通用的,在所有情况下都是这样,并非在 iOS 系统上如此。.baidu.com 和 image.baidu.com 可以使用彼此的 cookie 是因为服务端做了特殊的处理。
Cookies 操作
iOS 系统当中的 cookies 由系统底层实现和使用,同时提供了NSHTTPCookieStorage和NSHTTPCookie来统一操作 cookie。NSHTTPCookieStorage是一个单例,我们所有的 cookies 都存放在这里,当我们发起网络请求时,系统会默认从NSHTTPCookieStorage当中匹配相应 cookie 并带上去,所以我们只需要操作NSHTTPCookieStorage即可。
以下是一些简单的使用
1 | /** |
跨域问题
针对跨域问题,可以在服务器和客户端分别做处理解决
服务器:在服务器返回 cookie 时同时将相关联的其他域的 cookie 返回
客户端:在每次请求完成后,对想跨域的域名进行设置,添加对应的 cookie
推荐在服务器配置相关策略
WKWebView 使用 cookie
因为 WKWebView 没有缓存,不使用NSHTTPCookieStorage,其 cookie 只存在内存当中,当前页面被释放其 cookie 也就消失了。因此 WKWebView 当中的请求不能使用其他请求的 cookie,同时两个 WKWebView 页面也不共享 cookie。
所以想要 WKWebView 使用其他请求的 cookie 或者前一个 WKWebView 页面的 cookie 需要在 WKWebView 加载前执行一段 js 代码,将 cookie 设置进去,而每次 WKWebView 请求之后获取 cookie,将其保存起来。至于存在哪里,NSHTTPCookieStorage和NSUserDefaults都是不错的选择。