在后台下载并在完成后唤醒应用程序
Downloading in background and waking app when finished
我使用配置为后台会话的 URLSession 下载一些文件。下载完成后我使用:
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
移动下载的文件。一切正常,除了当应用程序在后台时不会调用此功能。它在应用程序恢复到前台后立即调用,但我希望系统在下载文件后唤醒我的应用程序。有什么办法吗?
确实有:)
您可能需要更改设置中的一些内容。
首先,您使用的 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 例如。
希望对你有所帮助。
我使用配置为后台会话的 URLSession 下载一些文件。下载完成后我使用:
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
移动下载的文件。一切正常,除了当应用程序在后台时不会调用此功能。它在应用程序恢复到前台后立即调用,但我希望系统在下载文件后唤醒我的应用程序。有什么办法吗?
确实有:)
您可能需要更改设置中的一些内容。
首先,您使用的 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 例如。
希望对你有所帮助。