ios - swiftUI 在后台检测应用程序终止
问题描述
我有一个在后台运行的应用程序,它使用 CoreLocation 捕获用户的位置。我想在用户关闭应用程序时保存数据。
当应用程序进入后台时,我可以使用scenePhase
,但是如何检测应用程序在后台运行时将被终止?
import SwiftUI
@main
struct myApp: App {
@Environment(\.scenePhase) var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
.onChange(of: scenePhase, perform: { phase in
print(scenePhase)
})
}
}
}
这打印:
inactive
background
我也试过通知中心
NotificationCenter.default.addObserver(
forName: UIApplication.willTerminateNotification,
object: nil,
queue: .main)
{ _ in
print("terminated")
}
当应用程序已经在后台时,也不会调用它。
解决方案
从 applicationWillTerminate 的文档中:
对于支持后台执行的应用程序,当用户退出应用程序时,通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。
使用停用来保留用户的数据,并通过暂停所有主要工作使您的应用程序处于安静状态;具体来说:将用户数据保存到磁盘并关闭所有打开的文件。
基本上,当您的应用程序被停用和后台运行时,您将不知道该应用程序是否最终会被终止,因此您可能需要使用停用/后台处理来完成您的工作,如果这对您的用例有意义的话。每次在后台收到位置事件时,是否可以保存用户数据?
推荐阅读
- azure-ad-b2c - B2C 自定义策略 - 父 UserJourney 中是否可以访问 SubJourney OutputClaims
- java - 在多对多关系中插入数据
- python - 嗨,我正在尝试编写一个 sql alchemy 查询,但它给了我错误“无法确定要从哪个 from 子句加入”
- python - 它说“ValueError:对已关闭文件的 I/O 操作”但我打开了它
- android - 找不到 android.arch.core:core-testing:2.1.0
- metadata - Elementor Form:如何使用 webhook 传递元数据(如 RemoteIP)?
- c - 如何将浮点数格式化为小数点前有 3 个数字
- postgresql - 如何在 postgres 中的自定义运算符类上为 gin 索引创建支持函数?
- jquery - 如何在单击 td 元素时在模态中显示错误消息?
- javascript - 以函数为参数的 Jasmine Javascript jquery click() 不起作用