后台应用刷新对后台 URLSession 有影响吗?

Posted

技术标签:

【中文标题】后台应用刷新对后台 URLSession 有影响吗?【英文标题】:Does background app refresh have an effect on a background URLSession? 【发布时间】:2021-01-20 15:00:37 【问题描述】:

鉴于我有一个标准的背景URLSessionURLSessionDownloadTask,如下(为了示例,我特意简化了代码):

let sessionConfig = URLSessionConfiguration.background(withIdentifier: "mySessionID")

sessionConfig.isDiscretionary = false
sessionConfig.sessionSendsLaunchEvents = true

self.urlSession = URLSession(configuration: sessionConfig,
                             delegate: self,
                             delegateQueue: nil)

let task = urlSession.downloadTask(with: url)

task.resume()

似乎启用/禁用后台应用刷新(设置 => 常规 => 后台应用刷新)会改变 URLSession 及其委托的行为方式。

当后台应用刷新打开时,操作系统会在后台唤醒我的应用并调用 Apple 的 documentation 中描述的委托方法,例如,这允许我将下载的文件移动到照片库中。 当后台应用程序刷新关闭时,当应用程序处于后台时,永远不会调用委托方法。但是,当用户将应用放回前台时,它们会被调用。

两种场景下运行的代码是一样的,在管理器中实现URLSessionDownloadDelegate,在应用代理中实现application(_:handleEventsForBackgroundURLSession:completionHandler:)

我找不到任何来自 Apple 的官方文档说明这是真的。后台应用刷新应该只对后台应用刷新 API 产生影响(它允许您使用后台获取和后台处理)。

有没有人能够在后台下载文件并在后台应用刷新关闭的情况下在后台移动它?

【问题讨论】:

【参考方案1】:

我终于找到了这个问题的答案。在这里发布给遇到同样问题的人。

感谢thread,请参阅下面 Quinn 的回复:

ios 13 引入了新行为 (r. 47718087),据此,如果用户在设置中关闭了后台应用程序刷新 - 无论是全局还是为您的应用程序,假设它具有此设置 - 您的应用程序将不会恢复(或重新启动) ) 当任务在NSURLSession 后台会话中完成时。也就是说,您的会话将表现得好像 sessionSendsLaunchEvents 设置为 false。

【讨论】:

以上是关于后台应用刷新对后台 URLSession 有影响吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFNetworking 2.x 管理许多 (>500) 后台 URLSession 下载?

URLSession downloadTask 在后台运行时的行为?

Swift URLSession DataTask 在应用程序进入后台时失败

使用计时器在后台刷新应用程序

watchOS 上的后台 URLSession - 周期是啥?

关闭后台App刷新后台应用刷新是做什么的