使用 iOS 后台传输服务下载多个文件
Posted
技术标签:
【中文标题】使用 iOS 后台传输服务下载多个文件【英文标题】:Download multiple files using iOS background transfer service 【发布时间】:2014-04-03 15:57:40 【问题描述】:这里的问题是:如何使用新的后台传输服务(包括应用程序被暂停的情况)一个一个下载多个文件?我读了这个awesome tutorial on objc.io 并让它为一个文件工作。但是我需要一个一个地下载文件(所以添加多个NSURLSessionDownloadTasks
s 是行不通的(因为下载 URL 只在很短的时间内有效)
基本上,我要做的是在通知应用程序上一次下载在application:handleEventsForBackgroundURLSession:completionHandler:
中完成后安排另一次下载。但是我只调用了一次这个方法。知道为什么吗?任何有关如何在应用程序暂停时实现多个文件的顺序下载的建议。
更新:
抱歉,我可能不清楚实际问题是什么:并不是说我没有收到关于任务完成的通知,而是我没有在应用程序时调用application:handleEventsForBackgroundURLSession:completionHandler:
进行第二次下载任务正在在后台运行。我确实为第一个下载任务调用了它(它在应用程序处于前台时开始,然后在下载完成之前进入后台)然后我触发了第二个下载任务,调用 completionHandler
我在 application:handleEventsForBackgroundURLSession:completionHandler:
和从来没有为第二个文件调用此方法。
【问题讨论】:
【参考方案1】:我建议在NSURLSessionTaskDelegate
的- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
中添加下一个文件。每当上一个任务完成时都会调用此方法,因此将下一个文件排入队列似乎是一个合理的选择。
【讨论】:
请查看更新后的问题。在URLSession:task:didCompleteWithError:
中进行第二次下载并不能解决问题,我仍然没有为第二个文件调用application:handleEventsForBackgroundURLSession:completionHandler:
。
嗯,我明白了。肯定会看到奇怪的行为:我想我已经重现了您在示例 PoC 应用程序中描述的内容。然而,令人费解的是,我们在 prod 中拥有的更大的应用程序并没有表现出类似的行为(我的回答就是基于此)。不太清楚那里发生了什么:/
O.P. 链接的excellent article 提到:如果您的应用程序在后台启动后台传输,则该后台传输将始终获得@987654326 @ 旗帜。使用上述方法,第二次以及任何未来的传输都将在应用程序处于后台时启动。这意味着它们只有在设备具有 WiFi(不是蜂窝网络)和良好的电池时才能完成。我想他们也会被分批。也许它正在工作,但只是需要一段时间?【参考方案2】:
从本教程 (http://www.appcoda.com/background-transfer-service-ios7/) 的角度来看,您似乎必须同时开始下载这两个文件。由于您配置了会话中每个主机的最大连接数,我想您可以将并行下载限制为 1
,然后启动两个下载。
我目前正在尝试将其移植到 MonoTouch ... 看起来很有希望 ...
【讨论】:
如果我们遇到这样的情况,当task1完成时,我们应该在后台连续下载多个文件,task2开始并且如果task1失败,应用程序终止? @Hadizamani 由于 iOS 首先将文件下载到临时文件夹,因此您将看不到部分下载文件的任何内容。我猜您将无法访问文件中已下载的部分。以上是关于使用 iOS 后台传输服务下载多个文件的主要内容,如果未能解决你的问题,请参考以下文章
Java如何实现多线程传输文件,就像迅雷下载一样,开十多个线程分段传送字节流?