iOSアプリはライフサイクルのフェーズ — 起動、アクティブ、バックグラウンド、終了 — を移り変わり、SwiftUIはそれらを App プロトコルと scenePhase 環境値を通じて公開します。これらにフックして、適切なタイミングでデータを保存し、処理を一時停止し、UIを更新します。
仕組み
アプリのエントリポイントは が付き に準拠した です。1つ以上の (通常は )を返します。
iOSアプリはライフサイクルのフェーズ — 起動、アクティブ、バックグラウンド、終了 — を移り変わり、SwiftUIはそれらを App プロトコルと scenePhase 環境値を通じて公開します。これらにフックして、適切なタイミングでデータを保存し、処理を一時停止し、UIを更新します。
アプリのエントリポイントは が付き に準拠した です。1つ以上の (通常は )を返します。
@mainAppstructSceneWindowGroup@main
struct MyApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { _, newPhase in
switch newPhase {
case .active: resumeTimers() // app in foreground, interactive
case .inactive: pauseSensitive() // transitioning (e.g. app switcher)
case .background: saveState() // not visible — persist now
@unknown default: break
}
}
}
}
.active — フォアグラウンドでイベントを受信中。アニメーション、タイマー、ライブ更新を再開します。.inactive — 表示されているがイベントを受信していない状態(着信、アプリスイッチャー)。短い遷移状態です。.background — 表示されていない状態。終了の可能性がある前に状態を永続化しリソースを解放するための限られた時間が与えられます。.inactive ではなく .background で行ってください。inactiveは頻繁かつ短時間に発火します。BGTaskScheduler が必要です。AppDelegate / SceneDelegate では、同等のコールバックは applicationDidEnterBackground などです。SwiftUIは @UIApplicationDelegateAdaptor を通じてそれらにブリッジすることもできます。ユーザーは絶えずアプリを切り替え、システムは警告なしにバックグラウンドのアプリを終了できます。scenePhase に正しく反応することが、アプリを信頼できるものに感じさせます。保存されていないデータが生き残り、ユーザーが戻ってきたときに古いコンテンツを表示する代わりにUIが更新されるのです。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する