应用重启后监控 NSURLSession

Posted

技术标签:

【中文标题】应用重启后监控 NSURLSession【英文标题】:Monitoring NSURLSession after app restart 【发布时间】:2016-03-11 10:40:45 【问题描述】:

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

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

    当应用程序处于前台时,通过 NSURLSession 启动下载。 NSURLSession 是使用后台配置创建的。 我使用“Xcode Stop”终止了该应用程序,以便该应用程序继续在后台下载。当应用程序处于活动状态时,我会有序地接收来自 NSURLSession 的进度回调。 当下载尚未完成时,我手动启动应用程序(不是通过 Xcode,而是点击启动图标)。 我没有收到任何 URLSession 委托调用,这些调用是在以前的应用程序生命周期中开始的任务。唯一被调用的是 handleEventsForBackgroundURLSession,但它是由操作系统在 AppDelegate 上调用的(与 NSURLSession 委托调用不同的情况)。

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

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

会话对象保持对委托的强引用,直到您的应用明确使会话无效。如果您不使会话无效,则您的应用会泄漏内存。

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

【问题讨论】:

嘿,在这个BG Transfer Demo,你实现了从后台删除应用程序后恢复下载??? 如果应用程序被手动(由用户)从后台删除,我不会继续下载。发生这种情况时,ios 可能会取消 URL 会话。重新启动应用程序后,您可以手动检查持久任务的状态并执行适当的操作。如果你愿意,我可以发给你“BG Transfer Demo”或者上传到某个仓库供你checkout。 是的,请在我的 gmail id 上向我发送演示。 patelmonika006@gmail.com & patelmonika0612@gmail.com 提前致谢。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

我在后台接收回调没有问题。问题是应用程序重新启动后我无法获得进度更新回调(应用程序可能由于内存压力或崩溃而被 iOS 杀死;无论哪种方式 iOS 都会继续后台下载会话)。因此,如果用户重新启动应用程序,我无法在进度视图上为他更新进度条。

以上是关于应用重启后监控 NSURLSession的主要内容,如果未能解决你的问题,请参考以下文章

设备重启后的 IOS8 iBeacon 监控

手机重启后 iBeacon 监控/测距

iOS 设备重启后继续位置更新

监控windows服务,当服务停止后自动重启服务

监控windows服务,当服务停止后自动重启服务

基于IIS的OA网站监控及自动重启脚本