后台队列进程在最小化时终止应用程序

Posted

技术标签:

【中文标题】后台队列进程在最小化时终止应用程序【英文标题】:Background Queue processes Terminates app when minimised 【发布时间】:2021-04-08 21:28:51 【问题描述】:

我有 3 个后台队列任务在应用启动时运行。它们大约需要 25 秒才能完成。没有内存问题,也没有任务本身的问题,任务只是通过数据库过滤/读取数据(SQLite)。

如果我在任务运行时最小化应用程序,应用程序会在 3 秒内被终止,因为任何时候我在 3 秒后返回应用程序时,应用程序都会重新启动。最小化应用程序后,我立即收到“来自调试器的消息:由于信号 9 而终止”。我使用 Swift 和 ios14,有没有办法在应用程序未从内存中释放的情况下完成 30 秒或更短的后台 SQLite DB 任务?或者只是暂停/终止任务以防止终止应用程序?

我使用 DispatchQueue 扩展运行我的任务:

extension DispatchQueue 

static func background(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) 
    DispatchQueue.global(qos: .background).async 
        background?()
        if let completion = completion 
            DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: 
                completion()
            )
        
    


static func backgroundFast(delay: Double = 0.0, background: (()->Void)? = nil, completion: (() -> Void)? = nil) 
    DispatchQueue.global(qos: .default).async 
        background?()
        if let completion = completion 
            DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: 
                completion()
            )
        
    



【问题讨论】:

需要使用后台任务API。这里有来自 Apple 的示例代码 developer.apple.com/documentation/backgroundtasks/… 这不是在应用进入后台时调度后台任务吗?我对我的任务暂停并在应用程序可见时运行感到满意。我只是想防止应用程序在每次最小化时终止/重新启动。 “最小化”是什么意思? 【参考方案1】:

如果您只需要 25 秒来完成您的后台任务,您应该能够调用 beginBackgroundTask(withName:expirationHandler:) 方法来响应您的应用委托的 applicationDidEnterBackground(_:) 方法被调用。

这将为您提供最多 3 分钟的后台时间。

有关更多信息,请参阅 Apple 的这篇文章。

https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/extending_your_app_s_background_execution_time

需要注意的一件事(引用 Apple 的文档)

警告

如果你正在使用场景(参见场景),UIKit 不会调用它 方法。使用 sceneDidEnterBackground(_:) 代替执行任何最终 任务。 UIKit 发布一个 didEnterBackgroundNotification 不管 您的应用是否使用场景。

【讨论】:

以上是关于后台队列进程在最小化时终止应用程序的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序进程被终止时,请勿打开上一个活动

Windows并发&异步编程创建终止进程

WinPhone 应用程序事件对应用程序进程终止作出反应

在子进程运行和通信时终止子进程,这些子进程通过队列干净地通信

应用程序在后台运行时如何弹出QMessageBox?

用户终止应用通知 (iOS)