📝

SwiftUIのscenePhaseでアプリの状態を管理する

2024/08/27に公開

scenePhase とは?

scenePhase は、iOSアプリのライフサイクルを監視するためのプロパティです。具体的には、アプリがフォアグラウンド、バックグラウンド、またはインアクティブ状態にあるかを監視し、その状態に応じて適切な処理を実行できます。アプリの状態変化に応じてリソースの管理やUIの更新を行う際に非常に役立ちます。詳細については、Apple公式ドキュメントを参照してください。

現在監視できるアプリの状態は以下の3つとなっています。

phese 状態
active アプリがフォアグラウンドで動作しているが、ユーザーが操作できない状態。例えば、アプリキルの直前など。
inactive アプリ動作中だが、操作できない状態(コントロールセンサーを下ろしたりアプリキルの直前状態
background アプリがバックグラウンドで動作している状態。別のアプリがフォアグラウンドで動作しているときや、ホーム画面にいるとき。

文章だけではイメージしづらいかもしれませんが、実際に実装してログを確認すると、scenePhase がどのように動作するか理解が深まるでしょう。

今回の目的

今回は、以下の2つの機能を実装します。
1.  バックグラウンド、フォアグラウンド、インアクティブ状態をアプリで管理する
2. それぞれの状態変化時にログを出力する

実装手順

今回の実装は、プロジェクト作成時に自動生成される ContentView に以下の処理を追加します。

struct ContentView: View {
    // アプリの状態を監視する
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some View {
        
        Text("Hello world")
        
            .onChange(of: scenePhase) { phase in
                switch phase {
                    
                    ///Background状態
                case .background:
                    print("background")
                    
                    ///foreground状態
                case .active:
                    print("active")
                    
                    ///inactive状態
                case .inactive:
                    print("inactive")
                    
                @unknown default:
                    break
                }
            }
    }
}

上記のコードを追加することで、アプリが各状態に遷移した際にログが出力されるようになります。

動作確認

この状態でアプリをバックグラウンドやフォアグラウンドに移動させ、コンソールに出力されるログを確認してみてください。それぞれの状態変化が正しくログに出力されることが確認できるはずです。

最後に

今回の実装で、アプリのライフサイクルを監視し、各状態での挙動をログとして確認する方法を学びました。これを応用すれば、状態変化に応じてユーザー体験を向上させる仕組みを実装することができます。

例えば、バックグラウンドに移行した際にデータを保存する処理や、フォアグラウンドに戻ったときに最新データを取得する処理を追加することで、より快適なアプリを提供できるようになります。

Discussion