iOS平臺下cookie的使用

享下最近項目用到的cookie的使用及管理

首先,先介紹下iOS對cookie的操作的兩個類:

帖子來源於:http://blog.csdn.net/chun799/article/details/17206907

1. NSHTTPCookie  2. NSHTTPCookieStorage

NSHTTPCookie對象代表一個HTTP cookie。 這是一個不可改變的對象,從一個包含cookie的屬性的字典初始化,這個類可以用來手動創建cookie的Properties 。

- (NSUInteger)version

- (NSString *)name;

- (NSString *)value;

- (NSString *)domain;

- (NSString *)path;

- (BOOL)isSessionOnly;等等屬性,具體屬性請自行谷歌

可以通過手工賦值的方式創建Cookie,如

+ (id)cookieWithProperties:(NSDictionary *)properties;

- (id)initWithProperties:(NSDictionary *)properties;

也可以從Cookie中讀取到所有屬性。

- (NSDictionary *)properties;

使用NSHTTPCookie的類方法可以將NSHTTPCookie實例與HTTP cookie header相互轉換.

根據NSHTTPCookie實例數組生成對應的HTTP cookie header

+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

從headerFileds中讀取到Cookie相關內容,生成NSHTTPCookie實例對象數組。

+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)theURL;

該方法會忽略headerFileds中與cookie無關的字段,如果headerFileds中的cookie沒有指定domain,則使用theURL的domain,如果沒有指定path,則使用”/”.

除非NSURLRequest明確指定不使用cookie(HTTPShouldHandleCookies設爲NO),否則URL loading system會自動爲NSURLRequest發送合適的存儲cookie。從NSURLResponse返回的cookie也會根據當前的cookie訪問策略(cookie acceptance policy)接收到系統中。

例如:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];  // 創建cookie屬性字典

[cookieProperties setObject:@"username" forKey:NSHTTPCookieName]; // 手動設置cookie的屬性

[cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];

[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];

[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];  // 通過NSHTTPCookie的cookieWithProperties方法,將屬性字典傳入進行初始化,對象返回的是一個NSHTTPCookie對象,創建完成後進行下一步操作:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];  // 將手動創建返回的NSHTTPCookie對象添加到NSHTTPCookieStorage中,在iOS中使用NSHTTPCookie類封裝一條cookie,通過NSHTTPCookie的方法讀取到cookie的通用屬性。在此聲明一點:如果你的request裏面明確不使用cookie,那麼要講cookie的(HTTPShouldHandleCookies設爲NO),否則URL loading system會自動爲NSURLRequest發送合適的存儲cookie。

下面來介紹一下NSHTTPCookieStorage對象:

NSHTTPCookieStorage提供了管理所有NSHTTPCookie 對象的接口在OS X裏,cookie是在所有程序中共享的,而在iOS中,cookie只當當前應用中有效。

通過sharedHTTPCookieStorage方法可獲取到共享的NSHTTPCookieStorage單件對象。

+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage

使用NSHTTPCookieStorage單件對象可獲取到當前存儲的所有cookie

- (NSArray *)cookies

或針對特定URL的cookie

- (NSArray *)cookiesForURL:(NSURL *)theURL;

還可以添加/刪除Cookie

– deleteCookie:

– setCookie:

– setCookies:forURL:mainDocumentURL:

通過NSHTTPCookieStorage可讀取/修改cookie接收策略,默認爲NSHTTPCookieAcceptPolicyAlways.

- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy

- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.

一共有三種cookie accept policy。typedef enum {

NSHTTPCookieAcceptPolicyAlways,

NSHTTPCookieAcceptPolicyNever,

NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain

}NSHTTPCookieAcceptPolicy;

NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默認策略.

NSHTTPCookieAcceptPolicyNever: 拒絕所有cookie

NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.

四.相關通知

NSHTTPCookieManagerCookiesChangedNotification

當NSHTTPCookieStorage實例中的cookies變化時發出此通知。

NSHTTPCookieManagerAcceptPolicyChangedNotification

當NSHTTPCookieStorage實例的cookie acceptance policy變化時發出此通知。

參考:

NSHTTPCookieStorage Class Reference

NSHTTPCookie Class Reference

URL Loading System Programming Guide – Cookie Storage

以上是對這兩個類的綜合介紹,如果有不懂,請自行百度或谷歌。

正文

說了這麼多,就來寫下我項目中用到的cookie管理


我這個操作是保存NSHTTPCookieStorage對象裏的所有cookie,當然也可以使用cookieForUrl來獲取cookie進行保存,方便後續的使用。此操作是在登錄的時候進行。

下面:


 這個方法就是更新cookie。在程序每次啓動的時候調用一下。用來確保每次的cookie是最新的。

然後:


 這個方法就是移除你保存的cookie了。因爲你在退出賬戶的時候需要重新獲取新的cookie,所以,你需要在退出賬戶的時候清空你上次保存的cookie.   大概就是這麼多操作

staticNSString*kLocalCookieName =@"MyProjectCookie";

staticNSString*kLocalUserData =@"MyProjectLocalUser";

staticNSString*kServerSessionCookie =@"JSESSIONID";

最後  

寫的不好,也沒排版,請見諒。



文/花前月下(簡書作者)
原文鏈接:http://www.jianshu.com/p/65094611980c
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章