问题描述
鉴于我有一个标准背景 URLSession
和 URLSessionDownloadTask
,如下(为了示例,我特意简化了代码):
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 产生影响(它允许您使用后台提取和后台处理)。
有没有人能够在后台下载文件并在后台应用刷新关闭的情况下移动它?
解决方法
我终于找到了这个问题的答案。在这里发布给遇到同样问题的任何人。
感谢这个thread,请参阅下面奎因的回复:
iOS 13 引入了新行为 (r. 47718087),如果用户在“设置”中关闭了后台应用刷新——无论是全局还是为您的应用,假设它具有此设置——您的应用将不会被恢复(或重新启动) ) 当任务在 NSURLSession
后台会话中完成时。也就是说,您的会话将表现得好像 sessionSendsLaunchEvents
被设置为 false。