2013/07/01更新

[XCODE] NSURLConnectionを用いた通信でCookieを簡単に扱う方法

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
最近iPhoneアプリ制作で、Cookieを用いた認証管理の方法を実装しました。 実装初期はHTTPヘッダをパースすることでCookieを扱っていたのですが、実は便利な方法があることが判明したので備忘録の意味も込めてブログに残したいと思います。

画像



NSURLConenctionを用いた通信でCookieを扱う

認証が必要なAPIを実行したい場合に認証方法は色々とありますが、1つにCookieを用いた認証の保持があります。 ログインなどの認証で成功したら、レスポンスのクッキーに認証情報が付与されて、その後のリクエストにその認証情報を付与することで認証済みとして扱う方法です。

Webページとかで実装する場合には、Cookieの保存や送信はサーバー側の処理でほとんど自動的に行ってくれますが、iPhoneアプリで通信を実装する場合にはCookieの扱いを扱う必要があります。

今回のブログでは、レスポンスに付与されたCookieを取得する方法と、リクエストにCookieを付与する方法に分けてブログを書きたいと思います。



レスポンスに付与されたCookieを取得する方法

レスポンスにCookieが付与されている場合、レスポンスヘッダーにCookieが以下のような形式で設定されます。
Set-Cookie: num=123456; expires=Sun, 10-Jun-2001 12:00:00 GMT; path=/HTTP/
Cookieの詳細な説明は、「Studing HTTP」が分かりやすかったです。このSet-Cookieの情報をHTTPヘッダの文字列からパースして取得することももちろん可能ですが、もっと簡単な方法が用意されていました。
以下のような実装をすることで、レスポンスヘッダーに付与されたCookieをすべて取得することが出来ます。
// リクエストを作成し、送信します
NSString *urlString = @"http://reader.livedoor.com/";
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request  queue:[[NSOperationQueue alloc] init]  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

  // 受け取ったレスポンスから、Cookieを取得します。
  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
  NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:httpResponse.allHeaderFields forURL:response.URL];

  // 受け取ったCookieのうち必要なものは、
  // 保存しておくと今後使う時に便利です。  
  for (int i = 0; i < cookies.count; i++) {
      NSHTTPCookie *cookie = [cookies objectAtIndex:i];
      NSLog(@"cookie: name=%@, value=%@", cookie.name, cookie.value);
      [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
  }
}];
NSHTTPCookieという便利なクラスが用意されていて、HTTPResponseからのCookieの取得や、CookieStorageへの保存など便利な機能が満載です。
これでCookieの取得と、今後使うためのStorageへの保存を行うことが出来ました。



リクエストにCookieを付与する方法

続いてリクエストにCookieを付与する方法です。上記で取得してCookieStorageに保存したCookieを、リクエストに設定します。
// リクエストを生成します。
// リクエストは色々と設定したいのでMutableなクラスを指定します。
NSString *urlString = @"http://reader.livedoor.com/api/subs";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// CookieStorageから保存されたCookieを読み込み、
// リクエストにCookieを設定します。
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:url];
NSDictionary *header = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
[request setAllHTTPHeaderFields:header];
Cookieのセットでも、CookiStorageからの取得、HTTPヘッダ用のNSDictionaryの作成などの機能が用意されており、 すごく簡単に実装することが出来ます。



最後に

iPhoneアプリでサーバーと通信する際に、NSURLConnectionを使うことも多いのではないでしょうか。
Cookieを使う場面はあまり多くありませんが、もしCookieを使う必要がある場合にこの記事が少しでも役立てば幸いです。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。