#タイトルが長くなってきた
さてクッキーを自前でハンドリングするにしても用意されているクラスが使えればそれにこしたことが無い。Foudation.framework には幸いなことに NSHTTPCookie クラスが用意されている。
NSHTTPCookie Class Reference
これが使えそうかどうか調査してみよう。
リファレンスを眺めると3つのインスタンス作成メソッドが用意されていた。
このうち、+[NSHTTPCookie cookiesWithResponseHeaderFields:forURL:] を試してみる。
cookiesWithResponseHeaderFields:forURL:
デリゲートメソッドに仕掛ける。
サーバから受け取ったレスポンス内のヘッダ情報を渡してみた。
AppController.m
- (void)webView:(WebView *)sender
resource:(id)identifier
didReceiveResponse:(NSURLResponse *)response
fromDataSource:(WebDataSource *)dataSource
{
NSDictionary* headers = [(NSHTTPURLResponse*)response allHeaderFields];
NSURL* url = [response URL];
NSArray* cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:headers forURL:url];
NSLog(@"---------------");
NSLog(@"%@", url);
NSLog(@"%@", cookies);
}
実行してみよう。Googleへ行き、非ログイン状態で「ログイン」リンクを押してみた。
するとサーバからクッキーが送られてきた。先ほどのメソッドでうまく取り込めているようだ。
2009-08-17 21:14:58.569 WebPageScreenshotUtility[2160:10b] ---------------
2009-08-17 21:14:58.621 WebPageScreenshotUtility[2160:10b] https://www.google.com/accounts/Login?hl=ja&continue=http://www.google.co.jp/
2009-08-17 21:14:58.640 WebPageScreenshotUtility[2160:10b] (
<NSHTTPCookie
version:0
name:@"GoogleAccountsLocale_session"
value:@"ja"
expiresDate:@"(null)"
created:@"272175298.569016"
sessionOnly:TRUE
domain:@"www.google.com"
path:@"/accounts"
secure:FALSE
comment:@"(null)"
commentURL:@"(null)"
portList:(null)>,
<NSHTTPCookie
version:0
name:@"GALX"
value:@"fo7Y_pW13-M"
expiresDate:@"(null)"
created:@"272175298.569091"
sessionOnly:TRUE
domain:@"www.google.com"
path:@"/accounts"
secure:TRUE
comment:@"(null)"
commentURL:@"(null)"
portList:(null)>
)
※読みやすい様に改行を入れてある
- - - - -
おお、これは便利。ヘッダ内のCookieの解析はこれが使えそうだ。