如何使用目标C在iOS上本地下载和保存文件?

时间:2011-03-16 09:44:03

标签: objective-c ios download wget local-storage

我是Objective-C的新手,我想从网上下载一个文件(如果在网络服务器上进行了更改)并将其保存在本地,以便我的应用程序可以使用它。

主要是我想实现wget --timestamp <url>所做的事情。

6 个答案:

答案 0 :(得分:147)

我不确定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];
}

答案 1 :(得分:15)

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委托方法来监控错误,下载完成,下载进度等...如果您愿意,也可以使用内联块完成处理程序回调方法。苹果文档说明何时需要使用其中一个。

阅读这些文章:

objc.io NSURLConnection to NSURLSession

URL Loading System Programming Guide

答案 2 :(得分:14)

我会使用完成块来使用异步访问。

此示例将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);
    }
}];

答案 3 :(得分:6)

我认为更简单的方法是使用ASIHTTPRequest。三行代码可以实现这一目标:

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

Link to Reference

更新:我应该提到不再维护ASIHTTPRequest。作者特别建议人们使用其他框架,例如AFNetworking

答案 4 :(得分:1)

前段时间我实现了一个易于使用的“下载管理器”库:PTDownloadManager。你可以试一试!

答案 5 :(得分:0)

有很多方法:

  1. NSURL

  2. ASIHTTP

  3. libcurl

  4. easyget,具有强大功能的商业广告。