ScenePhase
An indication of a scene’s operational state.
Declaration
enum ScenePhaseMentioned in
Overview
The system moves your app’s Scene instances through phases that reflect a scene’s operational state. A scene’s operational state can vary depending on what platform it’s on and whether it’s in the foreground, minimized, in the app switcher, or in the background. You can perform actions when the phase changes. Read the current phase by observing the scenePhase value in the Environment:
@Environment(\.scenePhase) private var scenePhaseHow you interpret the value depends on where it’s read from. If you read the phase from inside a View instance, you obtain a value that reflects the phase of the scene that contains the view. The following example uses the onChange(of:initial:_:) method to enable a timer whenever the enclosing scene enters the ScenePhase.active phase and disable the timer when entering any other phase:
struct MyView: View {
@ObservedObject var model: DataModel
@Environment(\.scenePhase) private var scenePhase
var body: some View {
TimerView()
.onChange(of: scenePhase) {
model.isTimerRunning = (scenePhase == .active)
}
}
}If you read the phase from within an App instance, you obtain an aggregate value that reflects the phases of all the scenes in your app. The app reports a value of ScenePhase.active if any scene is active, or a value of ScenePhase.inactive when no scenes are active. This includes multiple scene instances created from a single scene declaration; for example, from a WindowGroup. When an app enters the ScenePhase.background phase, expect the app to terminate soon after. You can use that opportunity to free any resources:
@main
struct MyApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
MyRootView()
}
.onChange(of: scenePhase) {
if scenePhase == .background {
// Perform cleanup when all scenes within
// MyApp go to the background.
}
}
}
}