在后台获取期间使用后台 nsurlsession 和后台任务是否有意义?

yur*_*gis 3 ios

如果应用程序依赖于后台获取并且需要在获取的数据不为空时进行一些处理,那么这样做是否有意义:

1) 使用后台 NSURLSession 获取数据(使用 backgroundSessionConfigurationWithIdentifier)

2)在后台任务中处理数据(使用beginBackgroundTask)

由于系统给了 30 秒的时间来完成后台提取,因此似乎不需要 #1 或 #2。文档(https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html)没有明确说明这些技术是否可以组合,所以我只是寻求确认.

yur*_*gis 5

好吧,经过一些背景知识的挖掘,我想我至少可以为那些仍然想知道的人回答我自己的问题。

  1. 使用后台配置的 NSURLSession 进行后台获取

    • 该应用程序在后台获取期间只需 30 秒即可完成下载。如果整个下载流程花费的时间少于此限制,则可以使用默认 URLSession(无需后台配置)。

    • 但是,如果正在加载的资源很大,那么花费 30 秒(或更短)的时间进行准备并使用后台配置启动 URLSession 是非常有意义的。配置完成后,您的 NSURLSession 对象将无缝地将下载任务移交给系统,因此资源传输将不受 30 秒完成限制的限制。

  2. 使用后台任务进行后台获取

    • 使用后台任务,应用程序可以将暂停最多延迟 3 分钟,以完成可能由用户在运行时启动的相对较长的运行任务(例如,短文件上传、下载、文件 i/o 等)前景。
    • 与 StackOverflow 中提供的许多示例相反,您无需等到应用程序移至后台。耗时不到 3 分钟的任务可以在 beginBackgroundTask / endBackgroundTask 中执行,即使您的应用程序在前台执行也是如此。我会继续声称,几乎在任何情况下,在没有 beginBackgroundTask / endBackgroundTask 范围的情况下运行这样的任务都是错误的,因为编写处理 applicationDidEnterBackground 的代码来跟踪由于以下原因启动的长时间运行任务的完成情况要痛苦得多用户与 UI 的交互。
    • 如果用户界面和系统的后台获取都希望启动下载作业,那么重用相同的代码从而将两种技术结合在一起是完全可以的。