为了确定应用程序是否终止,我已经执行了有限长度的任务,但是一段时间后,应用程序被终止并从开始屏幕启动。
func registerBackgroundTask() {
backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
self?.endBackgroundTask()
}
assert(backgroundTask != .invalid)
}
func endBackgroundTask() {
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = .invalid
if backgroundTask != .invalid {
endBackgroundTask()
}
}
func applicationDidEnterBackground(_ application: UIApplication) {
registerBackgroundTask()
}
在执行“有限长度”任务时,不应终止应用程序,请提供示例以标识处于挂起模式时终止应用程序的情况。
答案 0 :(得分:1)
在执行有限长度任务时不应终止应用
根本没有保证。您的应用可能会被终止的原因很多。 beginBackgroundTask
是对OS的更多时间请求,以完成对用户的短期运行操作。它不保证您的请求将被批准。
您执行此操作的特定方式可能偶尔会失败,并且在文档中有专门说明:
在开始任务之前,最好在应用程序实际进入后台之前,尽早调用此方法。该方法异步请求您的应用程序的任务断言。如果您在即将暂停应用程序之前调用此方法,则系统可能会在授予该任务断言之前挂起您的应用程序。例如,不要在applicationDidEnterBackground(_ :)方法的末尾调用此方法,并希望您的应用程序继续运行。如果系统无法授予任务断言,它将调用您的到期处理程序。
您要包装要请求时间的特定操作。无论您是否认为自己已进入后台,都必须包装该操作。您不仅会在每次进入后台时都调用它。
请提供示例,以识别应用程序处于挂起模式时的终止情况。
在applicationWillEnterBackground
中将一个值写入UserDefaults
。在applicationDidEnterForeground
中,删除密钥。在applicationWillFinishLaunching
中,查找该密钥。如果在那里,那么您将被重新启动,因此有时您在后台死亡。其中包括重启或电源故障。如果不存在,那么这是第一次启动,或者您在前台崩溃了。实施此操作的确切方法高度取决于您打算如何处理这些信息。