swift - 在后台和唤醒应用时,快速下载

  显示原文与译文双语对照的内容
98 3

我使用URLSession配置为后台会话下载一些文件。下载完成后,我将使用:

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)

要移动下载的文件,除非应用程序在后台,否则这里函数不被调用。在应用程序恢复到前台后调用它,但我希望系统在下载文件后唤醒我的应用程序。有什么方法可以做到这一点?

时间:原作者:0个回答

119 5

确实存在:)

你可能需要在你的设置中改变一些东西。

首先,你使用的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 中定义一个可选的选项,以便以后可以以存储它:

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()
 }
 }

另外,在本教程中,我们将看一下

希望能帮助你。

原作者:
...