iosにおけるcookiesの紹介と基本的な使い方

4099 ワード

一.Cookie
Cookieはクライアントにサーバ状態を格納するメカニズムであり、WebサーバはSet-CookieまたはSet-Cookie 2 HTTPヘッダを介してCookieを設定することができる.
Cookieは、セッションCookieと永続Cookieの2つに分類され、セッションCookieは一時Cookieであり、現在のセッション終了(ブラウザ終了)時にCookieが削除されます.永続Cookieはユーザーのハードディスクに格納され、ブラウザが終了し、再起動してもCookieは存在します.セッションCookieと永続Cookieの違いは、Discardパラメータ(Cookieバージョン1)が設定されている場合、またはExpires(Cookieバージョン0)またはMax-AGe(Cookieバージョン1)が設定されていない場合、このCookieはセッションCookieです.
Cookieには2つのバージョンがあり、1つはバージョン0(Netscape Cookies)とバージョン1(RFC 2965)で、現在多くのサーバで使用されているCookie 0です.
Cookieの詳細については、「HTTP権威ガイド」の章を参照してください.
二.NSHTTPCookie
iOSでNSHTTPCookieクラスを使用して1つのcookieをカプセル化し、NSHTTPCookieの方法でcookieの汎用属性を読み取る.
- (NSUInteger)version; 
- (NSString *)name; 
- (NSString *)value; 
- (NSString *)domain;
- (NSString *)path; 
- (BOOL)isSessionOnly;

Cookieは、手動で値を割り当てることで作成できます.
+ (id)cookieWithProperties:(NSDictionary *)properties;
- (id)initWithProperties:(NSDictionary *)properties;
+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields 
forURL:(NSURL *)theURL;

Cookieからすべてのプロパティを読み込むこともできます. 
- (NSDictionary *)properties;

NSHTTPCookieのクラスメソッドを用いる、NSHTTPCookieインスタンスとHTTP cookieヘッダとを相互に変換することができる.
NSHTTPCookieインスタンス配列から対応するHTTP cookieヘッダを生成する
+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

HeaderFiledsからCookie関連コンテンツを読み込み、NSHTTPCookieインスタンスオブジェクト配列を生成します.
この方法では、headerFiledsのクッキーに関係のないフィールドは無視する、headerFiledsのクッキーがdomainを指定していない場合はtheURLのdomainを使用し、pathを指定していない場合は「/」を使用する.
URL loading systemは、NSURLRequestがクッキーを使用しないことを明確に指定しない限り、適切なストレージクッキーをNSURLRequestに自動的に送信します.NSURLResponseから返されるクッキーも、現在のクッキーアクセスポリシー(クッキーacceptance policy)に従ってシステムに受信されます.
三.NSHTTPCookieStorage
NSHTTPCookieStorage単品クラスは、すべてのNSHTTPCookieオブジェクトを管理するインタフェースを提供します.OS Xでは、cookieはすべてのプログラムで共有されていますが、iOSでは、cookieは現在のアプリケーションでのみ有効です.
共有NSHTTPCookieStorage単品オブジェクトはsharedHTTPCookieStorageメソッドで入手できます.
+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;

NSHTTPCookieStorage単品オブジェクトを使用して、現在保存されているすべてのCookieを取得します.
- (NSArray *)cookies

または特定のURLに対するクッキー
- (NSArray *)cookiesForURL:(NSURL *)theURL;

Cookieの追加/削除も可能
– deleteCookie:
– setCookie:
– setCookies:forURL:mainDocumentURL:

NSHTTPCookieStorageによるCookie受信ポリシーの読み取り/変更は、NSHTTPCookieAcceptPolicyAlwaysがデフォルトである.
- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy; 
- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.

全部で3種類のクッキーaccept policyがあり、
 
  
typedef enum {
   NSHTTPCookieAcceptPolicyAlways,
   NSHTTPCookieAcceptPolicyNever,
   NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
} NSHTTPCookieAcceptPolicy;

NSHTTPCookieAcceptPolicyAlways:すべてのCookieを受信し、デフォルトポリシー.NSHTTPCookieAcceptPolicyNever:すべてのCookieを拒否NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:main document domainのcookieのみを受信.
四.関連通知
NSHTTPCookieManagerCookies ChangedNotificationこの通知は、NSHTTPCookieStorageインスタンスのcookiesが変更されたときに発行されます.
NSHTTPCookieManagerAcceptPolicyChangedNotificationこの通知は、NSHTTPCookieStorageインスタンスのCookie acceptance policyが変化したときに発行されます.WU
五.関連実装
- (void)saveCookies
{
    NSData *cookies = [NSKeyedArchiver archivedDataWithRootObject:[NSHTTPCookieStorage sharedHTTPCookieStorage].cookies];
    [[NSUserDefaults standardUserDefaults] setObject:cookies forKey:@"savedCookie"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}


- (void)reloadStoredCookies
{
    NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedCookie"]];
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    
    for (NSHTTPCookie *cookie in cookies) {
        [cookieStorage setCookie:cookie];
    }
}

参考:NSHTTPCookieStorage Class ReferenceNSHTTPCookie Class Reference URL Loading System Programming Guide–Cookie Storage