iPhone/iPadネットワークプログラミング(2) HTTPRequestでダウンロード
前回、HTTPRequestの方法は書かないと言ったけど、やはりネットワークプログラミングをまとめたいので残しておくことにした。一番簡単なのでまずはこいつから。
ファイルのダウンロードやサーバ側に PHP や CGI などのスクリプトを置いて処理させる場合に使える。
ちなみにアップロードも可能だ。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 や ニコ動などの動画や音楽ファイルなどを取ってこれる。
次回は、Mac と iPhone との通信を IPアドレス指定でやってみる。