ios - 在后台创建会话下载任务

Posted

技术标签:

【中文标题】ios - 在后台创建会话下载任务【英文标题】:ios - Create Session Download Task in Background 【发布时间】:2016-01-13 02:33:27 【问题描述】:

在我的应用程序中,我在后台使用NSURLSessionDownloadTask。当应用程序处于前台时,我恢复了一项下载任务。稍后当应用程序再次处于后台时,该下载任务完成并且在函数didCompleteError 我想在应用程序仍处于后台时创建另一个下载任务。但是下载任务没有运行。谁能帮帮我?

【问题讨论】:

您需要在问题中包含相关代码。 在 func didCompleteError 中,我创建了下载任务: dispatch_async(dispatch_get_main_queue(), ^ NSURLSessionDownloadTask *downloadTask = [self.session downloadTaskWithResumeData:movie.resumeData]; [downloadTask resume]; );当我使用 xcode 在模拟器或设备上调试时,下载任务简历。但是在没有 xcode 的设备上运行,下载任务不运行。 【参考方案1】:

试试这个代码:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite


-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error


-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes


-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location

不像NSURLConnection,我们通常为每个请求创建一个连接,NSURLSession,我们创建一个会话,而不是多个任务。

让我们定义我们的会话:

NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfiguration:@“myUniqueAppID”];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

我们首先要做的是创建一个配置,让它在后台运行。配置需要特定于您的应用的唯一标识符。最好使用应用的捆绑标识符,例如 com.yourCompany.appName

一旦我们有了我们的配置,我们就可以实例化我们的会话,我们在其中传递对委托的引用以及我们希望它在哪个队列上运行。你最喜欢的会希望它成为 mainQueue。

就本主题而言,我们将只处理下载任务。因此,一旦您有了要下载的文件的 URL,您就可以通过会话创建一个 downloadTask:

NSURLSessionDownloadTask* task = [_session downloadTaskWithRequest:request];

[task resume];

现在NSURLSession 的工作方式是将您的文件直接下载到临时目录。因此,您无需担心存储它。

在下载时,它会通知您已下载了多少,这对于通知您的用户下载进度非常有用:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

   CGFloat percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite;
   // Notify user.

下载文件后,将调用以下方法:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location

   // Either move the data from the location to a permanent location, or do something with the data at that location.

该方法的最后一个参数是数据下载到的位置。从这里,您可以将文件移动到可以使用它的永久位置,或者您可以访问数据并对其进行处理。但是,这些数据不会留在那里,所以如果你真的需要它,请确保不要离开它。

值得注意的是,Tasks 就像 NSURLConnection 一样可以取消:

[_currentTask cancel];

关于使用 NSURLSession 下载文件的基础知识。

我希望你觉得这很有用!

【讨论】:

感谢您的帮助。我的应用程序使用与您的指南相同的代码运行良好。 .但我想问当应用程序在后台时,我恢复另一个下载任务。在模拟器上,下载任务恢复正常,但在设备上,下载任务无法恢复。 如果此代码对您有帮助,请接受我的回答。 这没有回答问题。

以上是关于ios - 在后台创建会话下载任务的主要内容,如果未能解决你的问题,请参考以下文章

如何取消我恢复的 NSURLSessionDownloadTask 以恢复我上次启动应用程序时创建的下载(后台)任务

AFNetworking 2.0 是不是支持后台任务? - IOS 7

(iOS)后台运行下载任务

ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调

关于ios中后台长时间下载任务的实现与走过的坑

谈一谈iOS开发后台下载