iOS平台下每一个APP都有自己的Cookie,APP之间不共享Cookie,一个Cookie 对应一个NSHTTPCookie实体,并通过NSHTTPCookieStrorage进行管理。那些需要持久化的Cookie是存放在~/Library/Cookies/Cookies.binarycookies 文件中的二进制格式。
Cookie的生成途径有两种,一种是访问网页,网页返回的是HTTP Header 中有 Set-Cookie指令进行Cookie 的设置,这里Cookie 的本地处理其实是由WebKit 进行的;还有一种途径就是我们客户端通过手动设置的Cookie。
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"name" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"value" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"www.baidu.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
[cookieProperties setObject:@"30000" forKey:NSHTTPCookieMaximumAge];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
//[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
其实,NSHTTPCookieStorage 存在一个问题,那就是SetCookie或者DeleCookie后并不会立即进行持久化,而是有几秒钟的延迟。如果在持久化未完成之前APP收到了SIGLKILL 的信号,APP 退出,那么就会导致cookie 相关的操作的丢失。在模拟器调试的时候,Xcode重启模拟器的时候会发给APP 的就是 SIGKILL,不过真正的生产环境中很少有这种情况。不过有时候为了可靠性,我们还是会将cookie 的信息保存一份到User Defaults中的,需要的时候再load进来。