ScenePhaseとは?アプリのアクティブや非アクティブ、バックグラウンドなど状態を取得

この記事は約4分で読めます。

ScenePhaseは、アプリのライフサイクルの変化(アクティブ、非アクティブ、バックグラウンド)を監視するために使用されます。

これにより、アプリの状態に応じて特定のアクションを実行することができます。
この記事では、ScenePhaseの使い方について解説します。

  • iOS:14.0以上
  • XCode(当サイトの環境):15.0.1

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を使用することで、アプリのライフサイクルに応じた適切なアクションを実行することができます。

これにより、アプリの状態管理を効果的に行うことが可能になります。

タイトルとURLをコピーしました