在阅读了与新的iOS7 api (NSURLSession)有关的背景下载的苹果文档之后,我有点失望。我确信苹果正在管理后台网络可用性上的暂停/恢复(或者提供这样做的选项),但没有…。
因此,阅读这些文档,我们得到的是:
当任何任务完成时,NSURLSession对象将调用委托的URLSession: task :didCompleteWithError: method,如果任务成功完成,则调用该方法。如果任务是可恢复的下载任务,则NSError对象的userInfo字典包含NSURLSessionDownloadTaskResumeData键的值。您的应用程序应该使用可达性API来确定何时重试,然后调用downloadTaskWithResumeData:或downloadTaskWithResumeData:completionHandler:创建一个新的下载任务来继续下载。转到步骤3(创建和恢复任务对象)。
到目前为止,我理解解决方案,但我的问题是:在后台处理网络丢失和恢复下载的最佳架构是什么?
在我这方面,我使用的是可达性,每次网络可用时,我都会恢复所有任务(创建时通过NSArray引用),并在网络丢失时挂起它们。这在前景中运行良好,但对于背景,我需要在以下几点上提供帮助:
- In foreground, I start downloading my tasks
- I go to background and after 10s switch to "aireplan mode"
- All my tasks got an error. So in the method URLSession:task:didCompleteWithError: I resume them using downloadTaskWithResumeData or if I can't (because some have not enough resume data) I'm creating a new task without resume-ing it (except if network is back at that time).
- Then I put the wifi up
- As I'm still in background I cannot trigger a "resume" when network is back without launching the application…
我该如何处理这些问题?我错过了什么吗?
发布于 2013-10-09 08:11:29
由于我仍然处于背景状态,所以在没有启动应用程序…的情况下,我无法触发网络恢复时的“简历”
您可以使用“后台获取”,当应用程序是通过fetch启动,然后您可以检查网络和恢复下载任务。
发布于 2013-11-08 21:07:35
您应该创建带有背景配置的NSURLSession,然后将任务发送到后台恶魔,并在其完成时调用您的应用程序。
发布于 2014-01-02 15:02:48
执行:
application:handleEventsForBackgroundURLSession:completionHandler:在应用程序中--没有调用completionHandler --在设备挂起时导致应用程序挂在后台。这样,当网络连接再次可用时,应用程序仍然可以监听可达通知并重新启动下载。然而,这是一个相当狡猾的方法,可能不会通过苹果的应用程序商店提交指南。此外,当连接丢失时,当应用程序处于前台,当应用程序被暂停时连接恢复时,这种方法没有多大帮助。
最后,我做了以下工作:
application:handleEventsForBackgroundURLSession:completionHandler:通知在后台暂停我的下载。application:performFetchWithCompletionHandler:completionHandler)检查连接状态并重新启动任何暂停的下载。(帽子-顶端@gugupluto)这仍然没有提供最佳的下载性能,可能会让用户怀疑,为什么他们的“后台下载”没有完成,一旦他们重新打开应用程序,但这似乎是最好的,我们可以希望从苹果目前。
https://stackoverflow.com/questions/19184490
复制相似问题