【问题标题】:What happens to NSURLSessionTasks if app is killed如果应用程序被杀死,NSURLSessionTask 会发生什么
【发布时间】:2015-08-04 06:57:55
【问题描述】:

假设我有一个正在运行的NSURLSessionUploadTask。如果应用程序在该时间段内被杀死或崩溃,挂起的请求会发生什么?任务还会完成还是也终止了?

【问题讨论】:

标签: ios cocoa-touch nsurlsession


【解决方案1】:

这是凭记忆写的,所以请谨慎对待。 IIRC,这取决于任务类型、任务的进度以及您是否提供了正文数据对象或正文流。

如果您使用的是非后台会话,则会取消请求。

如果您使用的是后台会话:

  • 如果您通过 URL 请求对象或作为创建上传任务的一部分提供了正文数据对象,则上传应该完成,因为会话基本上将该数据对象通过 XPC 发送到帮助程序进程,并且帮助程序可以处理上传。当然,如果数据对象在崩溃之前没有到达帮助程序,它就不会完成。

  • 如果您通过流提供正文,显然除非上传阶段完成,否则它不会完成,因为您的应用将无法提供数据。

如果上传完成,在 iOS 中,操作系统会在后台重新启动您的应用程序以处理接收到的数据;在 OS X 中,在用户重新启动您的应用之前什么都不会发生,此时操作系统会传递等待的数据。

如果您使用的是上传任务,则操作系统会在重新启动后将数据像数据任务一样交付给您的应用。然后,在 iOS(仅)上,它会告诉您它已交付所有未决事件,此时您的应用程序必须调用操作系统在您的应用程序首次重新启动时为您提供的回调,以告诉操作系统可以安全杀死您的后台应用程序。

请注意,如果您的应用在接收来自上传任务 IIRC 的响应数据时崩溃,您的应用将不会重新启动。如果上传操作的实际结果对您的应用至关重要,请使用下载任务进行上传,并通过提供的 NSURLRequest 对象提供正文数据对象。

【讨论】:

    【解决方案2】:

    来自Apple's Documentation

    如果系统在应用暂停时终止了应用,系统会在后台重新启动应用。

    它位于“如果应用程序被终止,则重新创建会话”部分。它解释了会发生什么以及如何需要在应用启动时重新创建会话,以便正确处理后台进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多