起動・前面・背面・停止の状態遷移。背面に回ると処理が制限され、メモリ不足で終了させられることもある。
iOS のアプリは、画面に出ているか、裏に回ったかで OS から状態を切り替えられます。今のアプリはシーン(ウィンドウ1つ分。iPad では複数持てる)ごとに状態を持ちます。SwiftUI では @Environment(\.scenePhase) で .active・.inactive・.background を受け取れます。
| 状態 | どんなとき | やること |
|---|---|---|
| アクティブ | 前面で操作できる | 通常の処理。画面の更新を再開 |
| 非アクティブ | 着信・通知センターを開いた・切り替え中 | 動画やゲームを一時停止。重い処理は始めない |
| バックグラウンド | ホームに戻った直後 | 編集中の内容を保存。タイマーや通信を止める。画面の機密情報を隠す |
| サスペンド | 裏で止まっている | コードは動かない。ここから通知なしに終了されることがある |
大事なのは、サスペンド中に終了されても通知は来ないことです。だから「終了するときに保存」ではなく、バックグラウンドに入った時点で保存しておきます。次に開いたときは最初からの起動(コールドスタート)になるので、どの画面だったかを復元できるようにします(SwiftUI なら @SceneStorage)。
面接ではこう答える
iOS のアプリは、未起動・非アクティブ・アクティブ・バックグラウンド・サスペンドの状態を移り、今はシーンごとに状態を持ちます。着信などでは一時的に非アクティブになり、ホームに戻るとバックグラウンドを経て数秒でサスペンドされます。サスペンド中はメモリが足りなくなると通知なしに終了されるので、終了時ではなくバックグラウンドに入った時点で保存し、次の起動で元の画面を復元できるようにします。
Appとの関わり編集中のデータが消える、画面が最初に戻るといった不具合の多くはライフサイクルの扱いが原因なので、調査と設計の両方で使います。