ScenePhaseは、アプリのライフサイクルの変化(アクティブ、非アクティブ、バックグラウンド)を監視するために使用されます。
これにより、アプリの状態に応じて特定のアクションを実行することができます。
この記事では、ScenePhaseの使い方について解説します。
ScenePhaseとは
ScenePhaseは、アプリのシーンが現在どの状態にあるかを示す列挙型です。以下の3つの状態があります
active:アプリが前面にあり、ユーザーがインタラクションしている状態inactive:アプリが前面にあるが、ユーザーがインタラクションしていない状態(電話の着信などで一時的に非アクティブになる場合)background:アプリがバックグラウンドにある状態
ScenePhaseの監視
ScenePhaseを監視することで、アプリのライフサイクルイベントに応じた処理を実装することができます。以下の例では、@Environmentプロパティラッパーを使用してscenePhaseを監視しています。
import SwiftUI
@main
struct ScenePhaseExampleApp: App {
@Environment(\.scenePhase) private var scenePhase
@State private var message = ""
var body: some Scene {
WindowGroup {
ScenePhaseSmpView(message: $message)
}
.onChange(of: scenePhase) {
switch scenePhase {
case .active:
message = "アプリがアクティブになりました"
case .inactive:
message = "アプリが非アクティブになりました"
case .background:
message = "アプリがバックグラウンドに入りました"
@unknown default:
message = "未定義の状態です"
}
}
}
}
struct ScenePhaseSmpView: View {
@Binding var message: String
var body: some View {
Text(message)
}
}

コードの解説
@Environment(\.scenePhase)
scenePhase環境変数を使用して、アプリのシーンフェーズの変化を監視します。
.onChange(of:scenePhase)
scenePhaseの値が変化したときに実行されるクロージャを定義します。新しいシーンフェーズに応じて、異なるアクションを実行します。
ScenePhaseSmpView
scenePhaseに応じて表示させるメッセージを変化させるためのビュー
実際の使用例
例えば、アプリがバックグラウンドに入るときにデータを保存し、アクティブになったときにデータを読み込む場合、次のように実装します。
loadDataやSaveDataはデータを読み込む処理や保存処理を定義しておきます。
.onChange(of: scenePhase) {
switch scenePhase {
case .active:
loadData()
case .inactive:
saveData()
case .background:
saveData()
@unknown default:
break
}
}まとめ
ScenePhaseを使用することで、アプリのライフサイクルに応じた適切なアクションを実行することができます。
これにより、アプリの状態管理を効果的に行うことが可能になります。

