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

Posted

技术标签:

【中文标题】完成后在后台下载并唤醒应用程序【英文标题】:Downloading in background and waking app when finished 【发布时间】:2017-03-16 16:50:39 【问题描述】:

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

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

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

【问题讨论】:

【参考方案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 是否存在,如果存在,请调用它。

示例

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

在您的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 为例。

希望对你有所帮助。

【讨论】:

感谢您的回答。事实证明,当我在设备上测试它按预期工作时,一切都已经工作了,但不是在模拟器中。此外,我并没有真正使用 handleEventsForBackgroundURLSession 函数,因为在每个应用程序启动后,我只是创建了创建具有相同标识符的会话并实现其委托的对象。似乎适用于每种情况,但我不能 100% 确定这种方法是否有效。将测试并查看。 啊是的...你说得对,它在模拟器中无法按预期工作,我忘记了,抱歉。很高兴你让它工作,祝你好运:)

以上是关于完成后在后台下载并唤醒应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在后台下载多个文件(仅限 iOS 7)

在后台下载数据的同时,从 JSON 中下载数据并存储到 CoreData 和 Display

iOS在一分钟内杀死CallKit VoIP应用程序在后台工作

iOS 中的后台获取和后台传输以在后台下载数据 (JSON)

ibacon 如何在后台工作?

iOS - 在后台下载并分配给 UITableViewCell imageView 的图像未填充视图