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

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

主要我想实现什么wget --timestamp <url>做。

我不知道wget是什么,但要从网上获取文件并将其存储在本地,您可以使用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]; } 

我会使用一个完成块的asynchronous访问。

本示例将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.comhttp://img.dovov.comsrpr/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); } }]; 

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委托方法来监视错误,下载完成,下载进度等…如果您愿意,还可以使用内联块完成处理程序callback方法。 苹果文档解释什么时候你需要使用一个在另一个。

阅读这些文章:

objc.io NSURLConnection到NSURLSession

URL加载系统编程指南

我认为更简单的方法是使用ASIHTTPRequest。 三行代码可以做到这一点:

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

链接到参考

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

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

有很多方法:

  1. NSURL

  2. ASIHTTP

  3. 的libcurl

  4. easyget ,一个具有强大function的商业。