应用重启后监控 NSURLSession

Monitoring NSURLSession after app restart

我有一个监视下载任务的原型单视图应用程序。

我正在尝试处理以下用例:

  1. 当应用程序处于前台时,通过 NSURLSession 启动下载。 NSURLSession 是使用后台配置创建的。
  2. 我用 "Xcode Stop" 终止了该应用程序,以便该应用程序继续在后台下载。当应用程序处于活动状态时,我按顺序接收来自 NSURLSession 的进度回调。
  3. 我在下载尚未完成时手动启动应用程序(不是通过 Xcode,而是点击启动图标)。
  4. 我没有收到任何 URLSession 委托调用在上一个应用程序生命周期中启动的任务。唯一被调用的是 handleEventsForBackgroundURLSession 但它是由 OS 在 AppDelegate 上调用的(不同于 NSURLSession 委托调用的情况)。

我想显示正在进行的下载任务的进度。这可以在应用程序重新启动后完成(当应用程序被系统终止时,而不是手动终止!)?

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

The session object keeps a strong reference to the delegate until your app explicitly invalidates the session. If you do not invalidate the session, your app leaks memory.

但我想这只适用于应用程序处于活动状态的情况。当应用程序终止时,应用程序的所有对象都消失了。

您的目标似乎在​​第 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

确保 NSURLSession 在应用程序启动时正确初始化。这就是我的问题所在。我有 TransferManager 将会话初始化为惰性 getter 未被调用...

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

愚蠢的错误,但确实如此。