在阅读了有关使用新iOS7 api(NSURLSession)进行后台下载的Apple文档后,我有点失望。我确信Apple正在后台管理网络可用性的暂停/恢复(或提供这样做的选项),但没有......
所以阅读文档,这就是我们所拥有的:
当任何任务完成时,NSURLSession对象会调用 委托的URLSession:task:didCompleteWithError:带有a的方法 错误对象,如果任务成功完成,则为nil。 如果任务是可恢复的下载任务,则为NSError对象的userInfo字典 包含NSURLSessionDownloadTaskResumeData键的值。您的 应该使用可访问性API来确定何时重试,以及 然后应该调用downloadTaskWithResumeData:或 downloadTaskWithResumeData:completionHandler:创建一个新的下载 任务继续下载。转到第3步(创建并恢复 任务对象)。
到目前为止,我理解解决方案,但我的问题是:哪种架构最适合处理网络丢失并在后台继续下载?
就我而言,我正在使用可达性,每次网络可用时,我都会恢复所有任务(在创建时通过NSArray引用),并在网络丢失时暂停它们。这在前景中效果很好但是对于背景我需要帮助以下几点:
如果我的应用程序在前台没有连接,如果我在没有连接的情况下进入后台,我的所有任务都将暂停,如果网络可用,则不会再返回...
在后台丢失网络,停止我的所有下载/任务。 情形:
我如何解决这些问题?我错过了什么吗?
答案 0 :(得分:3)
当我还在后台时,如果没有启动应用程序,网络重新启动时我无法触发“恢复”...
你可以使用“后台获取”,当通过fetch启动应用程序时,你可以检查网络并恢复下载任务。
答案 1 :(得分:2)
您应该使用后台配置创建NSURLSession,然后将您的任务发送给后台恶魔,并在完成后调用您的应用。
答案 2 :(得分:2)
实现:
application:handleEventsForBackgroundURLSession:completionHandler:
在app delegate中的- 没有调用completionHandler - 导致应用程序在设备在挂起时失去连接后在后台闲逛。这样,当网络连接再次可用时,应用程序仍然可以收听可访问性通知并重新启动下载。但是,这是一个非常狡猾的方法,可能无法通过Apple的应用程序商店提交指南。此外,当应用程序处于前台并且在应用程序暂停时连接恢复时连接丢失时,此方法没有太大帮助。
最后我做了以下事情:
application:handleEventsForBackgroundURLSession:completionHandler:
通知在后台暂停我的下载。application:performFetchWithCompletionHandler:completionHandler
)来检查连接状态并重新启动任何暂停的下载。 (帽子提示@gugupluto)这仍然无法提供最佳的下载性能,并且可能会让用户想知道为什么他们的“后台下载”在重新打开应用后还没有完成,但它似乎是我们现在最好的希望来自Apple。