应用重启后监控NSURLSession

时间:2016-03-11 10:40:46

标签: ios nsurlsession nsurlsessiondownloadtask

我有一个原型单视图应用程序,可以监控下载任务。

enter image description here

我试图处理以下用例:

  1. 当app在前台时,下载是通过NSURLSession启动的。 NSURLSession是使用后台配置创建的。
  2. 我使用" Xcode Stop"来杀死应用程序,以便应用程序继续在后台下载。当应用程序处于活动状态时,我有条不紊地接收来自NSURLSession的进度回调。
  3. 当下载尚未完成时,我手动启动应用程序(不是通过Xcode,而是点击启动图标)。
  4. 我没有收到任何URLSession委托调用,用于在之前的应用程序生命中启动的任务。唯一被调用的是handleEventsForBackgroundURLSession,但操作系统在AppDelegate上调用(与NSURLSession委托调用不同)。
  5. 我想显示正在进行的下载任务的进度。这可以在应用程序重新启动后完成(当应用程序被系统终止时,而不是手动终止!)?

    在重新启动应用程序之后,NSURLSession会使用相同的标识符,新的委托对象进行初始化,因此我认为委托将继续接收会话任务的调用(因为会话标识符是相同的),但显然是这样的不是这样的。 Apple的文档中有一个注释:

      

    会话对象保留对委托的强引用,直到您的应用显式使会话无效。如果您没有使会话无效,您的应用程序会泄漏内存。

    但我想这只适用于app活着的情况。当应用程序终止时,所有应用程序的对象都将消失。

2 个答案:

答案 0 :(得分:1)

确保在应用启动时正确初始化NSURLSession。这就是我的问题所在。我有TransferManager初始化会话作为懒惰的getter,没有被调用...

现在NSURLSession已正确初始化,定期触发回调。

愚蠢的错误,但确实存在。

答案 1 :(得分:0)

你的目标似乎在​​4号,试图在后台接收URLSession委托回调。我一直在努力解决这个问题并且无法找到一个出色的解决方案,但是每当我执行任何操作时(甚至只是调用 completionHandler()回调)我都会意识到这一点在 handleEventsForBackgroundURLSession:我收到了对

的调用
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {

似乎执行操作可能会唤醒创建NSURLSession时指定的委托。

这是执行任何UI更新(例如显示进度)的正确方法,因为这是您知道后台任务完成的唯一位置。完成后,确保调用完成处理程序回调!

这也可能对您有所帮助:My NSURLSessionDelegate methods are not getting called during a background download