我使用配置为后台会话的URLSession来下载一些文件。下载完成后,我使用:
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
移动下载的文件。一切正常,除了当app在后台时,这个函数没有被调用。应用程序恢复到前台后立即调用它,但我希望系统在下载文件后唤醒我的应用程序。有没有办法做到这一点?
答案 0 :(得分:1)
的确有:)
您可能需要在设置中更改一些内容。
首先,您使用的URLSessionConfiguration
应为background
类型,如下所示:
URLSessionConfiguration.background(withIdentifier: "your.unique.id.here")
然后,在您的AppDelegate
中,您需要实施此方法:
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void)
您可以在此处存储completionHandler
,以便稍后使用。
最后,你通常在那里做“完成下载”魔术......通常在这里:
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
您需要检查是否存在completionHandler
,如果存在,则调用该。{/ p>
上面的最后两位可能看起来有点......嗯?所以这是一个例子。
在AppDelegate
中,您可以为completionHandler
定义一个可选内容,以便日后将其存储:
var backgroundSessionCompletionHandler: (() -> Void)?
然后该方法如下:
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
if identifier == "your.unique.id.here" {
backgroundSessionCompletionHandler = completionHandler
}
}
然后你只需要在处理完下载文件后再调用它,你可以这样做:
if let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let completionHandler = appDelegate.backgroundSessionCompletionHandler {
appDelegate.backgroundSessionCompletionHandler = nil
OperationQueue.main.addOperation {
completionHandler()
}
}
另外,例如,请查看this tutorial。
希望能帮到你。