后台队列进程在最小化时终止应用程序
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 不管 您的应用是否使用场景。
【讨论】:
以上是关于后台队列进程在最小化时终止应用程序的主要内容,如果未能解决你的问题,请参考以下文章