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進來。