NSURLSession后台下载 - 恢复网络故障

时间:2013-10-04 14:59:47

标签: ios ios7 nsurlsession

在阅读了有关使用新iOS7 api(NS​​URLSession)进行后台下载的Apple文档后,我有点失望。我确信Apple正在后台管理网络可用性的暂停/恢复(或提供这样做的选项),但没有......

所以阅读文档,这就是我们所拥有的:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

  

当任何任务完成时,NSURLSession对象会调用   委托的URLSession:task:didCompleteWithError:带有a的方法   错误对象,如果任务成功完成,则为nil。   如果任务是可恢复的下载任务,则为NSError对象的userInfo字典   包含NSURLSessionDownloadTaskResumeData键的值。您的   应该使用可访问性API来确定何时重试,以及   然后应该调用downloadTaskWithResumeData:或   downloadTaskWithResumeData:completionHandler:创建一个新的下载   任务继续下载。转到第3步(创建并恢复   任务对象)。

到目前为止,我理解解决方案,但我的问题是:哪种架构最适合处理网络丢失并在后台继续下载?

就我而言,我正在使用可达性,每次网络可用时,我都会恢复所有任务(在创建时通过NSArray引用),并在网络丢失时暂停它们。这在前景中效果很好但是对于背景我需要帮助以下几点:

  • 如果我的应用程序在前台没有连接,如果我在没有连接的情况下进入后台,我的所有任务都将暂停,如果网络可用,则不会再返回...

  • 在后台丢失网络,停止我的所有下载/任务。 情形:

    • 在前台,我开始下载我的任务
    • 我转到后台并在10秒后切换到“aireplan mode”
    • 我的所有任务都出错了。所以在方法URLSession:task:didCompleteWithError:我继续使用它们 downloadTaskWithResumeData或者如果我不能(因为有些没有 足够的恢复数据)我正在创建一个新任务而不恢复它(除非当时网络已经恢复)。
    • 然后我把wifi上了
    • 当我还在后台时,我不能在没有启动应用程序的情况下返回网络时触发“恢复”......

我如何解决这些问题?我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

当我还在后台时,如果没有启动应用程序,网络重新启动时我无法触发“恢复”...


你可以使用“后台获取”,当通过fetch启动应用程序时,你可以检查网络并恢复下载任务。

答案 1 :(得分:2)

您应该使用后台配置创建NSURLSession,然后将您的任务发送给后台恶魔,并在完成后调用您的应用。

答案 2 :(得分:2)

实现:

application:handleEventsForBackgroundURLSession:completionHandler:
在app delegate中的

- 没有调用completionHandler - 导致应用程序在设备在挂起时失去连接后在后台闲逛。这样,当网络连接再次可用时,应用程序仍然可以收听可访问性通知并重新启动下载。但是,这是一个非常狡猾的方法,可能无法通过Apple的应用程序商店提交指南。此外,当应用程序处于前台并且在应用程序暂停时连接恢复时连接丢失时,此方法没有太大帮助。

最后我做了以下事情:

  • 利用application:handleEventsForBackgroundURLSession:completionHandler:通知在后台暂停我的下载。
  • 利用间歇性后台获取通知(即application:performFetchWithCompletionHandler:completionHandler)来检查连接状态并重新启动任何暂停的下载。 (帽子提示@gugupluto)

这仍然无法提供最佳的下载性能,并且可能会让用户想知道为什么他们的“后台下载”在重新打开应用后还没有完成,但它似乎是我们现在最好的希望来自Apple。