应用程序强制退出和应用程序重新启动后如何恢复 NSURLSession 下载过程?
Posted
技术标签:
【中文标题】应用程序强制退出和应用程序重新启动后如何恢复 NSURLSession 下载过程?【英文标题】:How to resume NSURLSession download process after app force-quit and app relaunch? 【发布时间】:2015-11-01 11:02:16 【问题描述】:我已经实现了NSURLSession
从我们的服务器下载相当大的文件。现在只要我在前台或后台工作并返回应用程序,事务就可以正常工作并完成。
但如果我使用多任务屏幕强制退出应用程序并再次重新打开应用程序。下载过程尚未完成,尽管正如我从文档中了解到的那样,它应该是文档状态:
如果 ios 应用程序被系统终止并重新启动,该应用程序可以使用相同的标识符来创建新的配置对象和会话,并检索终止时正在进行的传输状态。此行为仅适用于系统正常终止应用程序。如果用户从多任务屏幕终止应用程序,系统将取消会话的所有后台传输。此外,系统不会自动重新启动用户强制退出的应用程序。 用户必须明确地重新启动应用程序才能重新开始传输。
意味着如果我重新启动应用程序,那么在 force-quit 之前的事务应该重新开始,或者是吗?是否需要执行其他操作才能使其正常工作?
更新:我偶然发现了这个项目: https://github.com/Heikowi/HWIFileDownload#force-quit
说明:
强制退出
应用被用户杀死后,下载不会在后台继续。在 iOS 7(及更高版本)上,恢复数据被传回。
意味着即使应用程序在后台被用户杀死,也有一种方法可以接收简历数据。只有项目是用 Objective-C 编写的,我不明白他们在做什么来实现这一点。
【问题讨论】:
我遇到了同样的问题.. 你能更新我一些关于这个的代码 @PRADIPKUMAR 接受的答案解决了这个问题。 【参考方案1】:强制退出后:
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 步。
【讨论】:
其实还不算太晚,谢谢你的回答。您能否详细说明我应该如何使用收到的数据来恢复下载。就像你说的,我在 didCompleteWithError 方法上收到了它。我应该立即使用 didCompleteWithError 方法中的 downloadTaskWithResumeData 开始另一个任务,还是需要将 resumeData NSData 对象保存在 UserDefaults 中并在下次应用程序运行时使用它? didCompleteWithError 将在您重新启动应用程序时立即调用,而不是在您强制退出时调用。因此,您只需将数据分配给一个属性,并在您要开始下载时检查此数据是否存在。 从调试过程中我看到我在应用程序实际被杀死之前到达了这个方法,而不是在它启动时。 好的,我现在尝试使用 iOS 9 模拟器,当你重新启动时会调用该方法,但在 iOS 8 中,它会在你杀死时调用。您使用的是哪个版本?可能在 iOS 8 中,您必须将数据保存在某处(例如 UserDefaults),但不知道它是否适用于大文件。 @GonjiDev 这怎么可能?当您的应用程序恢复时,我们是否要重新关联会话?在被终止时,NSURLSession
失去了对我们委托的引用,以便能够调用它。编辑:没关系,在这里引用苹果:Create a session configuration. For background sessions, this configuration must contain a unique identifier. Store that identifier, and use it to reassociate with the session if your app crashes or is terminated or suspended.
(developer.apple.com/library/content/documentation/Cocoa/…)【参考方案2】:
我认为在您的应用程序强制退出后,您应该重新开始(。
如果用户终止您的应用,系统会取消所有待处理的任务。
和
当与后台会话关联的所有任务都完成后,系统会重新启动已终止的应用程序(假设 sessionSendsLaunchEvents 属性设置为 YES 并且用户没有强制退出应用程序)
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
【讨论】:
【参考方案3】:-> 使用 URLSession 后台会话下载根本不会停止..您不必显式编码以恢复下载或其他内容..
https://developer.apple.com/reference/foundation/urlsession
检查此链接中的后台会话...如果您无法获得静止...评论我,我会提供详细帮助。
【讨论】:
以上是关于应用程序强制退出和应用程序重新启动后如何恢复 NSURLSession 下载过程?的主要内容,如果未能解决你的问题,请参考以下文章
怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。