NSURLSession后台下载 – 恢复networking故障

在阅读了关于使用新的iOS7 api(NS​​URLSession)进行背景下载的Apple文档之后,我感到有点失望。 我确定苹果公司正在pipe理暂停/恢复在后台的networking可用性(或提供这样做的选项),但没有…

所以阅读文档,这是我们得到的:

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:创build新的下载任务以继续下载。 转到步骤3(创build和恢复任务对象)。

到目前为止,我理解的解决scheme,但我的问题是:什么架构是最好的处理丢失的networking,并在后台恢复下载?

在我身边,我使用可达性,每当networking可用,我恢复所有任务(在创build时通过NSArray引用),并在networking丢失时挂起它们。 这在前台运行良好,但对于后台,我需要帮助以下几点:

  • 如果我的应用程序在前台没有连接,如果我没有连接到后台,所有我的任务将保持暂停状态,如果networking可用,则不会返回。

  • 在后台丢失networking,停止所有的下载/任务。 场景:

    • 在前台,我开始下载我的任务
    • 我去背景和10秒后切换到“aireplan模式”
    • 我的所有任务都有错误。 所以在方法URLSession:任务:didCompleteWithError:我使用downloadTaskWithResumeData恢复他们,或者如果我不能(因为有些没有足够的恢复数据)我创build一个新的任务,而不恢复它(除非networking回到那个时间)。
    • 然后,我把无线上网
    • 由于我仍然在后台,当networking回来而不启动应用程序时,我无法触发“简历”…

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

由于我仍然在后台,当networking回来而不启动应用程序时,我无法触发“简历”…


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

你应该使用后台configuration创buildNSURLSession,然后你的任务被发送到后台恶魔,当你的应用程序完成时被调用。

实现:

application:handleEventsForBackgroundURLSession:completionHandler: 

在应用程序委托 – 没有调用completionHandler – 导致应用程序挂起后,在设备失去连接,而暂停。 这样,应用程序仍然可以侦听可达性通知,并在networking连接再次可用时重新启动下载。 但是,这是一个非常狡猾的方法,可能无法通过苹果的app store提交指引。 此外,这种方法没有太大的帮助,当连接丢失,而应用程序在前台,连接恢复,而应用程序被暂停。

最后我做了以下几点:

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

这仍然不能提供最佳的下载性能,并可能导致用户想知道为什么他们的“后台下载”一旦重新打开应用程序还没有完成,但似乎是我们现在可以从苹果希望最好的。