如果应用程序被杀死,NSURLSessionTask 会发生啥
Posted
技术标签:
【中文标题】如果应用程序被杀死,NSURLSessionTask 会发生啥【英文标题】:What happens to NSURLSessionTasks if app is killed如果应用程序被杀死,NSURLSessionTask 会发生什么 【发布时间】:2015-08-04 06:57:55 【问题描述】:假设我有一个正在运行的NSURLSessionUploadTask
。如果应用程序在该时间段内被杀死或崩溃,挂起的请求会发生什么?任务还会完成还是也终止了?
【问题讨论】:
NSURLSession 文档可以帮助你developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 如果它对我有帮助,我不会问,不是吗?实际上,如果应用程序以不受控制的方式终止,则其中没有任何内容涉及它的行为。 如果用户杀死应用程序,后台任务被取消。检查这个***.com/questions/40613525/… 【参考方案1】:这是凭记忆写的,所以请谨慎对待。 IIRC,这取决于任务类型、任务的进度以及您是否提供了正文数据对象或正文流。
如果您使用的是非后台会话,则会取消请求。
如果您使用的是后台会话:
如果您通过 URL 请求对象或作为创建上传任务的一部分提供了正文数据对象,则上传应该完成,因为会话基本上将该数据对象通过 XPC 发送到帮助程序进程,并且帮助程序可以处理上传。当然,如果数据对象在崩溃之前没有到达帮助程序,它就不会完成。
如果您通过流提供正文,显然除非上传阶段完成,否则它不会完成,因为您的应用将无法提供数据。
如果上传完成,在 ios 中,操作系统会在后台重新启动您的应用程序以处理接收到的数据;在 OS X 中,在用户重新启动您的应用之前什么都不会发生,此时操作系统会传递等待的数据。
如果您使用的是上传任务,则操作系统会在重新启动后将数据像数据任务一样交付给您的应用。然后,在 iOS(仅)上,它会告诉您它已交付所有未决事件,此时您的应用程序必须调用操作系统在您的应用程序首次重新启动时为您提供的回调,以告诉操作系统可以安全杀死您的后台应用程序。
请注意,如果您的应用在接收来自上传任务 IIRC 的响应数据时崩溃,您的应用将不会重新启动。如果上传操作的实际结果对您的应用至关重要,请使用下载任务进行上传,并通过提供的 NSURLRequest 对象提供正文数据对象。
【讨论】:
【参考方案2】:来自Apple's Documentation。
如果系统在应用暂停时终止了应用,系统会在后台重新启动应用。
它位于“如果应用程序被终止,则重新创建会话”部分。它解释了会发生什么以及如何需要在应用启动时重新创建会话,以便正确处理后台进程。
【讨论】:
以上是关于如果应用程序被杀死,NSURLSessionTask 会发生啥的主要内容,如果未能解决你的问题,请参考以下文章
AWS ecs - 如果其中一个容器退出或被杀死,所有容器都会被杀死(停止)
如果应用程序从任务管理器中被杀死,NSUrlSession 是不是会继续文件传输?