在阅读了有关使用新 iOS7 api (NSURLSession) 进行后台下载的 Apple 文档后,我有点失望。我确信 Apple 正在后台管理网络可用性的暂停/恢复(或提供这样做的选项),但没有……</p>
所以阅读文档,这就是我们所拥有的:
当任何任务完成时,NSURLSession 对象调用代理的 URLSession:task:didCompleteWithError: 方法,带有一个错误对象,如果任务成功完成,则为 nil。如果任务是可恢复的下载任务,则 NSError 对象的 userInfo 字典包含 NSURLSessionDownloadTaskResumeData 键的值。您的应用应使用可达性 API 来确定何时重试,然后应调用 downloadTaskWithResumeData: 或 downloadTaskWithResumeData:completionHandler: 来创建新的下载任务以继续下载。转到步骤 3(创建和恢复任务对象)。
到目前为止我了解解决方案,但我的问题是:哪种架构最适合处理网络丢失并在后台恢复下载?
在我这边,我使用的是可达性,每次网络可用时,我都会恢复所有任务(在创建时通过 NSArray 引用),并在网络丢失时暂停它们。这在前台效果很好,但对于后台我需要以下几点帮助:
如果我的应用在前台没有连接,如果我在没有连接的情况下进入后台,我的所有任务都将保持暂停状态,并且在网络可用时不会返回......</p>
在后台失去网络,停止我所有的下载/任务。设想:
- 在前台,我开始下载我的任务
- 我进入后台,10 秒后切换到“aireplan 模式”
- 我所有的任务都出错了。所以在方法 URLSession:task:didCompleteWithError: 我使用 downloadTaskWithResumeData 恢复它们,或者如果我不能(因为有些没有足够的恢复数据)我正在创建一个新任务而不恢复它(除非网络回到那个时间)。
- 然后我把wifi挂了
- 由于我仍处于后台,因此当网络恢复时,我无法在不启动应用程序的情况下触发“恢复”……</li>
我该如何解决这些问题?我错过了什么吗?