---
title: ScenePhase
framework: swiftui
role: symbol
role_heading: Enumeration
path: swiftui/scenephase
---

# ScenePhase

An indication of a scene’s operational state.

## Declaration

```swift
enum ScenePhase
```

## Mentioned in

Migrating to the SwiftUI life cycle

## Overview

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 scenePhase How 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.             }         }     } }

## Topics

### Getting scene phases

- [ScenePhase.active](swiftui/scenephase/active.md)
- [ScenePhase.inactive](swiftui/scenephase/inactive.md)
- [ScenePhase.background](swiftui/scenephase/background.md)

## Relationships

### Conforms To

- [Comparable](swift/comparable.md)
- [Equatable](swift/equatable.md)
- [Escapable](swift/escapable.md)
- [Hashable](swift/hashable.md)
- [Sendable](swift/sendable.md)
- [SendableMetatype](swift/sendablemetatype.md)

## See Also

### Monitoring scene life cycle

- [scenePhase](swiftui/environmentvalues/scenephase.md)
