首页 > 解决方案 > 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")
}

当应用程序已经在后台时,也不会调用它。

标签: iosswiftui

解决方案


从 applicationWillTerminate 的文档中:

对于支持后台执行的应用程序,当用户退出应用程序时,通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。

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

使用停用来保留用户的数据,并通过暂停所有主要工作使您的应用程序处于安静状态;具体来说:将用户数据保存到磁盘并关闭所有打开的文件。

基本上,当您的应用程序被停用和后台运行时,您将不知道该应用程序是否最终会被终止,因此您可能需要使用停用/后台处理来完成您的工作,如果这对您的用例有意义的话。每次在后台收到位置事件时,是否可以保存用户数据?


推荐阅读