确实有:)
您可能需要更改设置中的一些内容。
首先,您使用的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 是否存在,如果存在,请调用它。
示例
上面的最后两位可能看起来有点……嗯??所以这里是一个例子。
在您的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 为例。
希望对你有所帮助。