一个 iOS app 会经历各个生命周期阶段——启动、活跃、后台、终止——SwiftUI 通过 App 协议和 scenePhase 环境值把它们暴露出来。你挂接到这些阶段上,以便在恰当的时机保存数据、暂停工作和刷新 UI。
工作原理
app 的入口点是一个标记为 并遵循 的 。它返回一个或多个 (通常是一个 )。
一个 iOS app 会经历各个生命周期阶段——启动、活跃、后台、终止——SwiftUI 通过 App 协议和 scenePhase 环境值把它们暴露出来。你挂接到这些阶段上,以便在恰当的时机保存数据、暂停工作和刷新 UI。
app 的入口点是一个标记为 并遵循 的 。它返回一个或多个 (通常是一个 )。
@mainAppstructSceneWindowGroup@main
struct MyApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { _, newPhase in
switch newPhase {
case .active: resumeTimers() // app in foreground, interactive
case .inactive: pauseSensitive() // transitioning (e.g. app switcher)
case .background: saveState() // not visible — persist now
@unknown default: break
}
}
}
}
.active——处于前台并接收事件。恢复动画、计时器、实时更新。.inactive——可见但不接收事件(来电、app 切换器)。一个短暂的过渡状态。.background——不可见。你会得到有限的时间来持久化状态并释放资源,之后 app 可能被终止。.background 而非 .inactive 中做繁重的保存——inactive 会频繁且短暂地触发。BGTaskScheduler,而不是这个阶段处理器。AppDelegate/SceneDelegate 时,对应的回调是 applicationDidEnterBackground 等。SwiftUI 仍可以通过 @UIApplicationDelegateAdaptor 桥接到它们。用户会不停地切换 app,系统也可能不加警告地终止一个后台 app。正确地响应 scenePhase 才能让 app 感觉可靠——未保存的数据得以存活,用户返回时 UI 会刷新而不是显示过时的内容。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠