Swift 完成后在后台下载并唤醒应用程序
我使用配置为后台会话的URLSession来下载一些文件。下载完成后,我使用:Swift 完成后在后台下载并唤醒应用程序,swift,background-process,download,urlsession,Swift,Background Process,Download,Urlsession,我使用配置为后台会话的URLSession来下载一些文件。下载完成后,我使用: func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) 移动下载的文件。一切正常,只是当应用程序在后台时,不会调用此函数。它在应用程序恢复到前台后立即调用,但我希望系统在文件下载后唤醒我的应用程序。有办法做到这一点吗?确实有:) 您可能需要更改
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()
}
}
然后,您“只”需要在处理完下载的文件后调用它,您可以这样做:
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()
}
}
另外,我们来看一个例子
希望这对你有帮助。确实有:)
您可能需要更改设置中的一些内容
首先,您使用的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()
}
}
然后,您“只”需要在处理完下载的文件后调用它,您可以这样做:
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()
}
}
另外,我们来看一个例子
希望这对您有所帮助。谢谢您的回答。事实证明,当我在一台设备上测试它是否按预期工作时,一切都已经正常工作了,但在模拟器中并没有。此外,我并没有真正使用handleEventsForBackgroundURLSession函数,因为每次应用程序启动后,我只是创建一个对象,该对象创建具有相同标识符的会话,并实现其委托。似乎对每种情况都有效,但我不能100%确定这种方法是否有效。将测试并查看。啊,是的……你是对的,它在模拟器中没有按预期工作,我忘记了,对不起。很高兴你能成功,祝你好运:)谢谢你的回答。事实证明,当我在一台设备上测试它是否按预期工作时,一切都已经正常工作了,但在模拟器中并没有。此外,我并没有真正使用handleEventsForBackgroundURLSession函数,因为每次应用程序启动后,我只是创建一个对象,该对象创建具有相同标识符的会话,并实现其委托。似乎对每种情况都有效,但我不能100%确定这种方法是否有效。将测试并查看。啊,是的……你是对的,它在模拟器中没有按预期工作,我忘记了,对不起。很高兴你能成功,祝你好运:)