如何在app强制退出并重新启动应用程序后恢复NSURLSession下载过程?

时间:2015-08-09 12:22:53

标签: ios swift nsurlsession forceclose nsurlsessiondownloadtask

我已经实现NSURLSession从我们的服务器下载相当大的文件。现在,只要我在前台或后台工作并回到应用程序,交易正在运行并完成。

但是如果我使用多任务处理屏幕强制退出应用程序并再次重新打开应用程序。下载过程没有完成,虽然我从文档中了解到它应该,这里的文档说明:

  

如果iOS应用程序被系统终止并重新启动,则应用程序可以使用相同的标识符来创建新的配置对象和会话,并检索终止时正在进行的传输的状态。此行为仅适用于系统正常终止应用程序。如果用户从多任务屏幕终止应用程序,系统将取消所有会话的后台传输。此外,系统不会自动重新启动用户强制退出的应用程序。 用户必须明确重新启动应用,然后才能重新开始传输

这意味着如果我再次启动应用程序,那么强制退出应该再次启动,或者是吗?我需要提交额外的操作才能使其正常工作吗?

更新:我偶然发现了这个项目: https://github.com/Heikowi/HWIFileDownload#force-quit

表明:

  

强制退出

     

用户杀死应用后,下载不会在后台继续。在iOS 7(及更高版本)上,将传回恢复数据。

意味着即使应用程序在后台被用户杀死,也有办法接收恢复数据。只有项目是用Objective-C编写的,我无法理解他们为实现这一目标所做的工作。

3 个答案:

答案 0 :(得分:22)

强行退出后:

 NSURLSessionTaskDelegate - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
重启应用程序时将调用

委托方法。如果可以恢复下载任务,则错误对象将包含恢复数据:

[error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData]

使用此数据,您可以通过创建NSURLSessionDownloadTask

来恢复下载过程
(NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData*)resumeData.

有关详细信息,请参阅Life Cycle of a URL Session with Custom Delegates,第13步。

答案 1 :(得分:1)

我认为在您的申请强制退出后,您应该重新开始(。

  

如果用户终止您的应用,系统会取消所有待处理的任务。

  

当与后台会话关联的所有任务完成后,系统会重新启动已终止的应用程序(假设sessionSendsLaunchEvents属性设置为YES,表示用户未强制退出应用程序

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

答案 2 :(得分:0)

- >使用URLSession背景会话下载根本不会停止....您不必显式代码恢复下载或其他东西..

https://developer.apple.com/reference/foundation/urlsession

检查此链接中的后台会话...如果您无法获得静止...请评论我,我会详细帮助。