在SwiftUI中如何判断应用是否被从后台移除?
SwiftUI 监测应用是否被从后台移除的实现方法
和传统Swift UIKit 中的实现逻辑完全对齐,SwiftUI 中有两种常用实现方案,具体使用步骤如下:
方案1:监听系统终止通知(全iOS版本兼容)
该方案直接复用 UIKit 体系下的UIApplication.willTerminateNotification通知,和UIApplicationDelegate中的applicationWillTerminate回调效果完全一致。
使用步骤:
- 在应用入口的
App结构体中,通过onReceive修饰符监听通知即可,示例代码:
import SwiftUI @main struct DemoApp: App { var body: some Scene { WindowGroup { ContentView() } // 监听应用即将终止通知 .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in // 此处执行应用被终止前的逻辑,比如数据持久化、状态上报等 print("应用即将被从后台移除") } } }
- 触发时机说明:该通知仅会在应用处于后台时,被用户主动上滑杀掉、或系统因内存不足回收进程时触发,应用正常退后台未被杀时不会触发。
方案2:结合ScenePhase监测(iOS 14+ 推荐)
SwiftUI 从iOS 14开始引入了ScenePhase枚举,用来声明式监听应用/场景的运行状态,更符合SwiftUI的语法规范,结合终止通知可以更精准的判断应用被移除时的状态。
使用步骤:
- 首先在
App结构体中声明环境变量scenePhase,监听场景状态变化,再配合终止通知做判断,示例代码:
import SwiftUI @main struct DemoApp: App { @Environment(\.scenePhase) private var scenePhase // 标记应用是否已经进入后台 @State private var isEnteredBackground = false var body: some Scene { WindowGroup { ContentView() } .onChange(of: scenePhase) { newPhase in switch newPhase { case .active: isEnteredBackground = false case .background: isEnteredBackground = true case .inactive: break @unknown default: break } } .onReceive(NotificationCenter.default.publisher(for: UIApplication.willTerminateNotification)) { _ in if isEnteredBackground { // 确认应用是在后台状态被移除,执行对应业务逻辑 print("应用在后台被用户移除") } } } }
注意事项:
- 如果你的应用支持iPad多窗口等多场景特性,建议将监听逻辑放置在对应
WindowGroup层级,不要全局监听,避免多场景切换时的状态误判 - 两种方案都不需要额外桥接UIKit的
AppDelegate,可以直接在纯SwiftUI项目中使用。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

