web-dev-qa-db-ja.com

目的Cを使用してiOSでローカルにファイルをダウンロードして保存するにはどうすればよいですか?

Objective-Cを初めて使用し、Webからファイルをダウンロードし(Webサーバーで変更された場合)、ローカルで保存して、アプリケーションで使用できるようにします。

主に、_wget --timestamp <url>します。

41
bogdan

Wgetが何であるかはわかりませんが、Webからファイルを取得してローカルに保存するには、NSDataを使用できます。

NSString *stringURL = @"http://www.somewhere.com/thefile.png";
NSURL  *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData )
{
  NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString  *documentsDirectory = [paths objectAtIndex:0];  

  NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"filename.png"];
  [urlData writeToFile:filePath atomically:YES];
}
147
Henning

IOS 7で導入されたNSURLSessionは、ファイルをダウンロードするSDKの推奨方法です。サードパーティのライブラリをインポートする必要はありません。

NSURL *url = [NSURL URLWithString:@"http://www.something.com/file"];
NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
self.downloadTask = [self.urlSession downloadTaskWithRequest:downloadRequest];
[self.downloadTask resume];

NSURLSessionDownloadDelegateデリゲートメソッドを使用して、エラー、ダウンロード完了、ダウンロードの進行状況などを監視できます。必要に応じて、インラインブロック完了ハンドラコールバックメソッドもあります。 Appleのドキュメントでは、どちらを使用する必要があるかについて説明しています。

これらの記事を読んでください:

objc.io NSURLSession to NSURLSession

RL Loading System Programming Guide

15
bandejapaisa

完了ブロックを使用して非同期アクセスを使用します。

この例では、Googleロゴをデバイスのドキュメントディレクトリに保存します。 (iOS 5以降、OSX 10.7以降)

NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [documentDir stringByAppendingPathComponent:@"GoogleLogo.png"];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.google.com/images/srpr/logo11w.png"]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if (error) {
        NSLog(@"Download Error:%@",error.description);
    }
    if (data) {
        [data writeToFile:filePath atomically:YES];
        NSLog(@"File is saved to %@",filePath);
    }
}];
14
Tibidabo

はるかに簡単な方法は、ASIHTTPRequestを使用することだと思います。 3行のコードでこれを実現できます。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"/path/to/my_file.txt"];
[request startSynchronous];

参照へのリンク

[〜#〜] update [〜#〜]:ASIHTTPRequestがメンテナンスされなくなったことに言及する必要があります。著者は、 AFNetworking のような他のフレームワークを代わりに使用することを人々に特にアドバイスしています。

6
pixelfreak

少し前に、使いやすい「ダウンロードマネージャー」ライブラリを実装しました: PTDownloadManager 。試してみてください!

1
Ali

たくさんの方法があります:

  1. [〜#〜] nsurl [〜#〜]

  2. [〜#〜] asihttp [〜#〜]

  3. libcurl

  4. easyget 、強力な機能を備えた商用のもの。

0
johnson