如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?

Posted

技术标签:

【中文标题】如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?【英文标题】:Does NSUrlSession continue file transfer if the app is killed from task manager?如果应用程序从任务管理器中被杀死,NSUrlSession 是否会继续文件传输? 【发布时间】:2014-07-30 21:37:05 【问题描述】:

为了更好地理解NSUrlSession,我尝试了网络上的各种示例(最后一个是this one)。

我希望看到的是:即使触发文件下载的应用程序被终止(例如用户通过任务管理器终止),文件下载仍将继续。然而,这似乎没有发生。

这是一个配置问题,还是如果应用程序终止,后台文件传输不起作用? 我认为整个想法是 ios 将重新启动应用程序。

【问题讨论】:

基本操作系统:当一个任务(在这种情况下是应用程序)终止时,所有资源都由操作系统恢复,包括 IO 资源。没有什么可以接收数据了。 是的,这应该可以。您最好发布您正在尝试的最短的完整示例,以便人们可以查看他们是否可以找出问题所在,而不是仅仅询问没有代码。 @Zaph 使用 NSURLSession,如果您在后台会话上开始任务,它会传递给操作系统的后台传输守护进程以完成。因此,它应该在应用程序被杀后幸存下来。任务完成后,应用程序由操作系统重新启动,并向应用程序委托发送通知,以便它可以通过重新连接会话来恢复。 我的理解基于“基础网络的新功能”session 707 at this year's WWDC。 Dan Vinegrad 似乎非常确信应用程序可能会崩溃或被杀死,并且会被唤醒以处理完成(大约 40m 英寸)。他使用了“杀死”这个词,但并没有专门谈论用户通过任务管理器杀死应用程序,所以也许这是一个特殊的例外? Aha! -- looks like it is an exception. @MattGibson 好发现!这也是我观察到的。想一想:在 WWDC 关于 NSUrlSession 的一次谈话中,演讲者说 iOS 将尊重任务管理器,这意味着如果应用程序关闭,它将不会重新启动或继续上传或下载。 @Krumelur 在 backgroundSessionConfigurationWithIdentifier 下特别提到了 iOS 的行为。 【参考方案1】:

如果系统终止了您的应用并且您的后台会话有活动下载,您的下载将继续,并且系统将在下载完成后启动您的应用。但是,如果用户强制退出您的应用,所有任务都会被取消。

Documentation for backgroundSessionConfigurationWithIdentifier:

如果 iOS 应用程序被系统终止并重新启动,该应用程序可以 使用相同的标识符创建一个新的配置对象和 会话并检索在 终止的时间。此行为仅适用于正常 系统终止应用程序。 如果用户终止应用 从多任务屏幕,系统取消所有会话的 后台传输。 另外,系统不会自动 重新启动用户强制退出的应用程序。用户必须 在重新开始传输之前明确地重新启动应用程序。

【讨论】:

措辞对我来说似乎很奇怪\令人困惑。最后两句没看懂。 “此外,系统不会自动重新启动用户强制退出的应用程序。”之前的一句话说系统取消了所有会话的传输,那为什么它说它不会重新启动应用程序?或者可能是说该应用不会重新启动以通知它转移已取消?【参考方案2】:

否 - 当用户强制退出时,应用不会重新启动以进行后台下载。

application:didReceiveRemoteNotification:fetchCompletionHandler: 的 iOS8 文档说:

使用此方法为您的应用处理传入的远程通知。 与 application:didReceiveRemoteNotification: 方法不同,它是 仅当您的应用程序在前台运行时调用,系统 当您的应用在前台运行时调用此方法或 背景。此外,如果您启用了远程通知 后台模式,系统启动您的应用程序(或从 暂停状态)并在推送时将其置于后台状态 通知到达。但是系统不会自动 如果用户强制退出它,则启动您的应用程序。在这种情况下, 用户必须在系统之前重新启动您的应用程序或重新启动设备 尝试再次自动启动您的应用。

【讨论】:

问题与后台抓取无关。 当问题是关于下载而答案是关于推送时,为什么这是公认的答案?

以上是关于如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 7 - 防止用户在任务管理器中杀死进程

Android:如果任务管理器杀死,则重新调用应用程序

VB.Net从任务管理器中隐藏进程[重复]

从 Eclipse 运行时如何杀死 Tomcat?

杀死特定的java应用程序[关闭]

杀死进程事件