ios - 通过有限长度任务识别应用程序终止
问题描述
为了识别应用程序终止,我已经实现了有限长度任务,但在一段时间后应用程序被终止并从开始屏幕启动。
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()
}
执行有限长度任务时不应终止应用程序,还请提供示例以识别应用程序处于挂起模式时的终止情况。
解决方案
执行有限长度任务时不应终止应用程序
这根本没有承诺。您的应用程序可能被终止的原因有很多。beginBackgroundTask
是向操作系统请求更多时间来完成为用户执行短期运行的操作。它不保证您的请求会被批准。
您执行此操作的具体方式可能偶尔会失败,并在文档中专门解决:
在开始你的任务之前尽早调用这个方法,最好在你的应用真正进入后台之前调用。该方法异步请求您的应用程序的任务断言。如果您在应用程序即将暂停之前调用此方法,则系统可能会在授予该任务断言之前暂停您的应用程序。例如,不要在您的 applicationDidEnterBackground(_:) 方法结束时调用此方法并期望您的应用程序继续运行。如果系统无法授予任务断言,它会调用您的到期处理程序。
您想要包装您想要请求时间的特定操作。无论您是否认为自己要进入后台,您总是会包装该操作。您不只是在每次进入后台时都调用它。
请提供示例以识别应用程序在挂起模式下的终止。
在applicationWillEnterBackground
将值写入UserDefaults
. 在applicationDidEnterForeground
中,删除密钥。在applicationWillFinishLaunching
中,寻找那把钥匙。如果它在那里,那么你将被重新启动,所以在某些时候你死在后台。这包括重启或电源故障等。如果它不存在,那么这是第一次启动,或者您在前台坠毁。实现这一点的精确方法很大程度上取决于您打算如何处理这些信息。
推荐阅读
- json - HL7v2 到 FHIR 转换默认 CodeSystem 规则不起作用
- pyspark - 更改 Livy 在 EMR 集群中使用的 Python 版本
- ffmpeg - ffmpeg 是否因 h.264 RTP 输出而损坏?
- python - How can i control multiple logins(like admin login and normal login) with flask login_required decorator
- android - 如何处理片段中的对话框点击
- android - 如何使用 MVVM 正确处理 RecyclerView 中的恒定数据流?
- assembly - 如何从内存中的数组中读取一个值,然后在 MIPS 中增加计数器?
- node.js - 从 express-handlebars 文件链接到 Javascript 文件
- javascript - 日本动漫js在javascript中发光一个div
- c++ - 具有 2 个错误的回文编程挑战