完成后在后台下载和唤醒应用程序

时间:2016-11-03 07:17:40

标签: swift background-process downloading urlsession

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

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

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

1 个答案:

答案 0 :(得分:1)

的确有:)

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

首先,您使用的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,如果存在,则调用该。{/ p>

实施例

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

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

希望能帮到你。