我具有同步功能,在后台会进行一系列下载。
为此,我创建具有以下背景配置的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会话的后台配置仍然没有不推荐使用。因此,我相信当前的后台下载实现是Apple推荐的一种。(据我了解,“ BGTaskScheduler”并非用于此目的,如果有误,请纠正我。)
所以,这是由于iOS 13中新引入的错误造成的吗?还是Apple希望针对iOS 13进行此实现的任何更改?
编辑:
我已经添加了handleEventsForBackgroundURLSession
回调。发现未打印相应的日志,并且在iOS 13的“设置”中应用程序的大小没有增加。因此,似乎下载未在后台继续,并且与未调用与下载相关的回调无关。
我想如果您在前台运行该应用程序,那么一切都会按预期进行,但是一旦将应用程序置于后台,就不会再收到回调了
BackgroundDownloader仅在应用程序处于前台状态时有效,但是在应用程序进入挂起/后台状态时有特定的支持。
[当应用处于暂停/终止状态并且下载完成时,iOS会通过调用:(在后台)将应用唤醒:
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
//TODO: Handle processing downloads
}
}
ios12和ios13之间的行为更改可能与某些API更改无关,而只是在应用程序不在前台时才采用了更为激进的省电策略