18

我已经实现NSURLSession了从我们的服务器下载相当大的文件。现在只要我在前台或后台工作并返回应用程序,事务就可以正常工作并完成。

但是,如果我使用多任务屏幕强制退出该应用程序并再次重新打开该应用程序。下载过程尚未完成,尽管正如我从文档中了解到的那样,它应该是文档状态:

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

这意味着如果我重新启动应用程序,那么在强制退出之前的事务应该重新开始,或者是吗?我需要执行其他操作才能使其正常工作吗?

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

这说明:

强制退出

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

这意味着即使应用程序在后台被用户杀死,也有一种方法可以接收简历数据。只有项目是用 Objective-C 编写的,我不明白他们在做什么来实现这一点。

4

3 回答 3

28

强制退出后:

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

重新启动应用程序时将调用委托方法。如果下载任务可以恢复,则错误对象将包含恢复数据:

[error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData].

使用此数据,您可以通过创建以下内容来恢复下载过程NSURLSessionDownloadTask

(NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData*)resumeData.

有关这方面的更多信息,请参阅具有自定义委托的 URL 会话的生命周期,第 13 步。

于 2015-10-05T10:19:35.430 回答
1

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

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

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

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

于 2015-08-09T15:01:02.707 回答
0

-> 使用 URLSession 后台会话下载根本不会停止......您不必显式编码以恢复下载或其他东西..

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

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

于 2017-04-11T04:29:05.920 回答