20

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

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

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

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

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

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

  • 如果我的应用在前台没有连接,如果我在没有连接的情况下进入后台,我的所有任务都将保持暂停状态,并且在网络可用时不会返回......</p>

  • 在后台失去网络,停止我所有的下载/任务。设想:

    • 在前台,我开始下载我的任务
    • 我进入后台,10 秒后切换到“aireplan 模式”
    • 我所有的任务都出错了。所以在方法 URLSession:task:didCompleteWithError: 我使用 downloadTaskWithResumeData 恢复它们,或者如果我不能(因为有些没有足够的恢复数据)我正在创建一个新任务而不恢复它(除非网络回到那个时间)。
    • 然后我把wifi挂了
    • 由于我仍处于后台,因此当网络恢复时,我无法在不启动应用程序的情况下触发“恢复”……</li>

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

4

3 回答 3

3

由于我仍在后台,所以当网络恢复时,我无法在不启动应用程序的情况下触发“恢复”……</p>


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

于 2013-10-09T08:11:29.267 回答
2

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

于 2013-11-08T21:07:35.383 回答
2

实施:

application:handleEventsForBackgroundURLSession:completionHandler:

在应用程序委托中 - 不调用 completionHandler - 导致应用程序在设备在挂起时失去连接后在后台挂起。这样,当网络连接再次可用时,应用程序仍然可以收听可达性通知并重新开始下载。但是,这是一种非常狡猾的方法,可能无法通过 Apple 的应用商店提交指南。此外,当应用程序处于前台时连接丢失并且在应用程序挂起时重新连接连接时,这种方法没有多大帮助。

最后我做了以下事情:

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

这仍然不能提供最佳的下载性能,并且可能会导致用户想知道为什么他们的“后台下载”在重新打开应用程序后还没有完成,但这似乎是我们目前可以从 Apple 获得的最好的期望。

于 2014-01-02T15:02:48.207 回答