2011年03月02日

NSURLConnectionクラスを使用してファイルダウンロード

インターネット上からファイルをダウンロードしてきて保存するプログラムを作りました。
ダウンロードの仕組み自体はNSURLConnectionクラスを使って作成することができますが、
その前に、データの通信方法には「同期通信」と「非同期通信」とがあり、それぞれの方式について理解しておく必要があります。

同期通信とは
クライアントからサーバへリクエストを送信したあと、レスポンスが帰ってくるまで次の処理をせずに待ち続ける方式。

非同期通信とは
クライアントからサーバへリクエストを送信したあと、レスポンスを待たずに次の処理を始める方式。

どちらの方式を使うかどうかは、サーバのレスポンスに、次の処理に影響があるデータが含まれるかどうかで決まります。
それぞれの方式についての詳細は、後述のブログで書きたいと思います。


|NSURLConnectionクラス

CoCoaフレームワークにはNSURLDownloadというファイルをダウンロードするのに便利なクラスが用意されているのですが、
iOS SDKには何故かこのクラスが含まれていません。
そこでiOSアプリでは、NSURLConnectionクラスを使ってファイルダウンロードの仕組みを実装してあげる必要があります。

私は今回、RootViewControllerクラスの中に以下のようにして同期通信方式で実装しました。


RootViewController.m
//同期通信

// request
directoryPath =
[NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
                                                               //ダウンロードファイルの保存先

NSString *filePath =
[[[directoryPath stringByAppendingPathComponent:filename]
stringByStandardizingPath] retain];            //保存したファイルへのパス

NSURL *url = [NSURL URLWithString:@"http://xxx.com/sample.doc"];   
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [
                    NSURLConnection
                    sendSynchronousRequest : request
                    returningResponse : &response
                    error : &error
                    ];
   
// error
NSString *error_str = [error localizedDescription];
if (0<[error_str length]) {
    UIAlertView *alert = [
                              [UIAlertView alloc]
                              initWithTitle : @"RequestError"
                              message : error_str
                              delegate : nil
                              cancelButtonTitle : @"OK"
                              otherButtonTitles : nil
                              ];
        [alert show];
        [alert release];
        return cell;
}
   
// responseを受け取ったあとの処理
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:filePath contents:[NSData data] attributes:nil];
NSFileHandle *file = [[NSFileHandle fileHandleForWritingAtPath:filePath]
                            retain];
[file writeData:data];



(参考サイト)
・「iphoneネットワークプログラミングその1〜その3」
http://iiphoneapp.blog51.fc2.com/category0-1.html

・「NSURLConnectionで同期通信・非同期通信してみた」
http://d.hatena.ne.jp/eth0jp/20100618/1276803780

・NSDownloadクラスについてはこちらがわかりやすいです
http://www.big.or.jp/~crane/cocoa/1000_webKit/NSURLDownload/index.html



sionami at 16:34│ iOS開発