【发布时间】:2020-05-12 13:10:53
【问题描述】:
我有一个同步功能,可以在后台进行一系列下载。
为此,我创建了一个 URLSession 实例,其背景配置如下:
let config = URLSessionConfiguration.background(withIdentifier: "BackgroundSessionDL")
config.httpMaximumConnectionsPerHost = 20
self.session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
每个下载任务(可能有数百个)添加如下:
var request = URLRequest(url: url)
request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let downloadTask = self.session.downloadTask(with: request)
downloadTask.resume()
此代码在 iOS 12 或更早版本上完美运行 - 即使已添加的任务在后台继续下载。 但是,对于 iOS 13,会导致以下问题:
- 一旦应用进入后台,下载就会停止。
- 如果任何下载任务正在进行并且应用程序被置于后台,即使应用程序再次被置于前台,也不会观察到与回调相关的日志。
我尝试搜索 Apple 是否为 iOS 13 上的后台任务下载引入了任何新的类/框架,但没有找到任何相关内容。此外,早期版本中用于表示后台下载任务的类在 iOS 13 中仍未弃用,并且是在 iOS 13 上搜索后台下载时的唯一结果。同样,用于 HTTP 会话的后台配置仍然不是已弃用。所以,我相信目前的后台下载实现是苹果推荐的。 (据我了解,“BGTaskScheduler”并非为此而生,如有错误请指正)。
那么,这是由于 iOS 13 中新引入的错误造成的吗? 或者,Apple 期望此实现(特定于 iOS 13)有任何变化?
编辑:
我已经添加了handleEventsForBackgroundURLSession 回调。发现在iOS 13的设置中没有打印相应的日志,应用程序大小没有增加。所以,后台下载似乎没有继续,与下载相关的回调没有被调用无关。
【问题讨论】:
-
你知道如何克服这种行为吗?我有同样的问题,已经花了几天时间试图弄清楚......一切都在 iOS13 上完美运行-
标签: ios swift nsurlsession ios13 nsurlsessiondownloadtask