iPhone/iPadネットワークプログラミング(2) HTTPRequestでダウンロード

前回、HTTPRequestの方法は書かないと言ったけど、やはりネットワークプログラミングをまとめたいので残しておくことにした。一番簡単なのでまずはこいつから。
ファイルのダウンロードやサーバ側に PHPCGI などのスクリプトを置いて処理させる場合に使える。
ちなみにアップロードも可能だ。PHPなどとの連携が必要だけどね。


まず、ダウンロードするURLと接続する。

NSString* urlPath = @"http://www.yahoo.co.jp/"
NSURL* url = [NSURL URLWithString:urlPath];
NSURLRequest* req = [NSURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:req delegate:self];
rData = [[NSMutableData alloc] init];

ここで、rData は NSMutableData* で、クラススコープにしておく。ヘッダに宣言しておくと良い。
NSURLRequest を対象となるURLを使って作成し、NSURLConnectionで接続する。以降は NSURLConnectionのデリゲートメソッドで処理を行う。


接続が成功すると次のデリゲートメソッドが呼ばれる。

- (void) connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
    NSDictionary* resDic = [(NSHTTPURLResponse*)response allHeaderFields];
    [textView setText:[NSString stringWithFormat:@"[Header]\n%@", resDic]];
    [rData init];
}

ここでは、ヘッダを予め用意した UITextView (textView) に表示している。
続いてデータの受信時に次のデリゲートメソッドが呼ばれる。

- (void) connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [rData appendData:data];
}

このメソッドはダウンロードすべきデータが終わるまで何回でも呼ばれる。データ受信完了すると次のメソッドが呼ばれ終了となる。

- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
    //文字コードに注意 ヘッダで見る?
    //このサンプルでは EUC-JP 意外無視
    NSString* rStr = [[NSString alloc] initWithData:rData encoding:NSJapaneseEUCStringEncoding];
    NSString* str = [textView text];
    [textView setText:[NSString stringWithFormat:@"%@\n\n[Body]\n%@", str, rStr]];
}

これで終わり。今回のサンプルでは普通の HTML をとってきているが、これをうまく使えば Youtube や ニコ動などの動画や音楽ファイルなどを取ってこれる。
次回は、MaciPhone との通信を IPアドレス指定でやってみる。