后台应用程序刷新是否对后台 URLSession 有影响?

Does background app refresh have an effect on a background URLSession?

鉴于我有标准背景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()

似乎 enabling/disabling 后台应用刷新(设置 => 常规 => 后台应用刷新)改变了 URLSession 及其代理的行为方式。

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

两种情况下的代码运行是相同的,它在管理器中实现URLSessionDownloadDelegate,在应用程序委托中实现application(_:handleEventsForBackgroundURLSession:completionHandler:)

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

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

我终于找到了这个问题的答案。在这里张贴给任何有同样问题的人。

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

iOS 13 introduces new behaviour (r. 47718087) whereby, if the user has turned Background App Refresh off in Settings — either globally or for your app, assuming it has this setting — your app won’t be resumed (or relaunched) when the tasks complete in an NSURLSession background session. That is, your session will behave as if sessionSendsLaunchEvents were set to false.