0

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

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

移动下载的文件。一切正常,除了当应用程序在后台时,这个函数没有被调用。它在应用程序恢复到前台后立即调用,但我希望系统在文件下载后唤醒我的应用程序。有没有办法做到这一点?

4

1 回答 1

2

确实有:)

您可能需要在设置中更改一些内容。

首先,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)

您需要检查 acompletionHandler是否存在,如果存在,请调用它。

例子

上面的最后两位可能看起来有点……嗯??所以这是一个例子。

在您的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()
        }
    }

另外,请查看本教程

希望对您有所帮助。

于 2016-11-03T07:30:43.797 回答