iPhoneネットワークプログラミング(ファイルダウンロード)

このエントリーを含むはてなブックマークはてなブックマーク - iPhoneネットワークプログラミング(ファイルダウンロード)

前回(iPhoneネットワークプログラミング(非同期通信))にひきつづき、ネットワークプログラミングその3では、Web上からファイルをダウンロードしてきてiPhoneに保存するプログラムを紹介します。

CoCoaフレームワークにはNSURLDownloadというクラスがあり、非常に簡単にファイルをダウンロードできるのですが、iPhoneではこのクラスが実装されていないため、NSURLConnectionクラスを使って自作する必要があります。

といっても、前回のプログラムと大きくは違わないので
簡単に理解できるかと思います。

sampleViewController.h

@interface networkViewController : UIViewController {
	NSFileHandle *file;
	NSString *filePath;
}
@end

sampleViewController.m

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
	NSLog(@"completed!");
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
	if (file == nil) {
		NSFileManager *fm = [NSFileManager defaultManager];
		[fm createFileAtPath:filePath contents:[NSData data] attributes:nil];
		file = [[NSFileHandle fileHandleForWritingAtPath:filePath] retain];
	}
	[file writeData:data];
}

- (void)viewDidLoad {
	[super viewDidLoad];

	NSString *url = [NSString stringWithString:
		@"http://www.ritsumei.ac.jp/acd/mr/lib/images/calender/kin.pdf"];	
	NSString *directoryPath = [[NSHomeDirectory()
		 stringByAppendingPathComponent:@"tmp"] retain];
	NSString *fileName = [url lastPathComponent];
	filePath = [[[directoryPath stringByAppendingPathComponent:fileName] 
		stringByStandardizingPath] retain];
	NSLog(@"%@", filePath);
	
	NSURLRequest *request = [ NSURLRequest requestWithURL:[NSURL URLWithString:url]];
	[ NSURLConnection connectionWithRequest: request delegate: self ];
}

これまでと同じく、ViewControllerのクラスに直接プログラムを書いていきます。理解しやすいよう、例外処理などは書いてないのでiPhoneに実装する際には追加が必要です。

viewDidLoadメソッドの中身から見ていきましょう。
NSURLConnectionを使って非同期でリクエストを送っているので大半は前回と同様のプログラムになっています。違いは、NSURLRequestを作る前に、ダウンロードするURL、ダウンロードファイル名、ダウンロード先フォルダなどのパスを設定している部分だけです。

2行目で、対象ファイルのあるURLの指定、
3行目で、保存するディレクトリパス(今回はtmpフォルダ)
4行目で、対象ファイルのファイル名を指定して
5行目で、保存するファイルパスを指定しています。

4行目で使用している、lastPathComponentというメソッドはパスからファイル名だけを取り出せる便利なメソッドです。例えばパスがhttp://www.ritsumei.ac.jp/acd/mr/lib/images/calender/kin.pdfであれば、lastPathComponentの戻り値はkin.pdfとなります。

あとは、デリゲートの説明です。
connectionDidFinishLoading:
connection:didReceiveData:
上の二つのメソッドがデリゲートとなっており、前者はダウンロードが完了したときにトリガされます。また、後者はサーバからデータが送られてくるごとに呼び出されます。こちらのメソッドは数回に分けて呼び出されるため、メソッド内のプログラムも、それに対応したものになっています。

connection:didReceiveData:
のメソッドでは最初に呼び出されたときにファイルを作成し、次の呼び出しからはそのファイルに追記していく処理を行っています。(データが数回に分けて送られてくるため、このような処理になります)

さて、実行してみてください。
うまくいけば、コンソールにファイルのパスとcompleted!と表示されます。Finderから表示されたファイルパスを辿ってみてください。実際にファイルが保存されていれば成功です。

2 Responses to “iPhoneネットワークプログラミング(ファイルダウンロード)”

  1. [...] iPhoneアプリと、そのプログラム iPhoneアプリを作る際に役立つプログラムを置いています コンテンツへ移動 ホーム紹介 ← iPhoneネットワークプログラミング(同期通信) iPhoneネットワークプログラミング(ファイルダウンロード) → [...]

  2. [...] iPhoneアプリと、そのプログラム iPhoneアプリを作る際に役立つプログラムを置いています コンテンツへ移動 ホーム紹介 ← iPhoneネットワークプログラミング(ファイルダウンロード) [...]

Leave a Reply

You must be logged in to post a comment.