2013年5月30日木曜日

[iOS]NSURLConnectionを使用してHTTP接続をする。

cookieの保存が必要だったのでメモを残しておく。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //リクエストを作成
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"GET"];
    [request setURL:[NSURL URLWithString:@"http://apple.ios.sample.com"]];
    [request setTimeoutInterval:30.0];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    
    //Cookieを保持している場合は読み込む
    //TODO Cookieの扱いがおかしい?
    NSHTTPCookie *cookie = nil;
    NSData *cookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"cookie"];
    if (cookiesData.length != 0) {
        NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesData];
        for (cookie in cookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }
    } else {
        //TODO Cookieが保持されていない
    }
    NSArray *cookieArray = [NSArray arrayWithObjects: cookie, nil];
    NSDictionary *headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookieArray];
    [request setAllHTTPHeaderFields:headers];
    
    //ネットワーク接続を開始
    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    [connection release];
    [request release];
}

#pragma mark -

//サーバーから認証の要求があった時に呼び出される
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    
}

//サーバーからレスポンスがあった時に呼び出される
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{   
    //Cookieを保存
    NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject:
                           [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
    [[NSUserDefaults standardUserDefaults] setObject:cookiesData
                                              forKey:@"cookie"];
    
    //レスポンスコード取得
    statusCode = [((NSHTTPURLResponse *)response) statusCode];
    
    if ([receivedData retainCount]) {
        [receivedData release];
    }
    receivedData = [[NSMutableData alloc] init];
}

//サーバーからデータを受け取ると呼び出される
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}

//サーバーからの通信が終わる直前に呼び出される
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //TODO receivedDataにbodyが入っている
}