初投稿です!
SwiftUIでiOSアプリを開発していて、アプリの起動状態を取得する方法を調べるのに苦労したので備忘録も兼ねてこの場で共有させていただきます。
iOSアプリにおける起動状態について
iOSアプリの起動状態はActive, Inactive, Backgroundの3つの状態に分けることができます。
状態遷移図は下図の通りです。起動するときはInactiveを経由してからActiveになることや、ActiveからBackgroundになるときもInactiveを経由することが分かると思います。
詳しくはApple公式ドキュメントを参照してください。
SwiftUIにおける取得方法
最近までSwiftUIではアプリの起動状態を取得するAPIが用意されていませんでしたが、iOS14からはScenePhaseを利用することで簡単に取得することができるようになりました。
具体的には、Appインスタンスに以下のプロパティを追加することで取得が可能になります。
@Environment(\.scenePhase) private var scenePhase
例を見てみましょう。Xcodeで新規プロジェクトを立ち上げたときに自動生成されるTestApp.swiftを以下のように書き換えます。(この場合Testがプロジェクト名となります)
//
// TestApp.swift
// Test
//
// Created by Ossamoon on 2020/12/25.
//
import SwiftUI
@main
struct TestApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { phase in
switch phase {
case .background:
print("バックグラウンド状態になりました")
case .active:
print("アクティブ状態になりました")
case .inactive:
print("非アクティブ状態になりました")
default:
print("このメッセージがでたら何か変だよ")
}
}
}
}
アプリをシミュレーターで起動してみましょう。すると、コンソールに「アクティブ状態になりました」というメッセージが現れます。
ここからスワイプでメニューを表示すると、「非アクティブ状態になりました」というメッセージが現れます。
さらに他の画面に移動すると、「バックグラウンド状態になりました」というメッセージが現れます。
ここで再びアプリの画面に戻ると、「非アクティブ状態になりました」というメッセージに続き「アクティブ状態になりました」というメッセージが現れます。
こんな感じの挙動を示します。実際に皆さんの手元で色々いじってみていただけたらと思います。
まとめ
ScenePhaseを使うとアプリの起動状態を簡単に取得できることがお分かりいただけたかと思います。
iOS14以降でないと使えないという制約はありますが、とても便利なAPIなので皆さんもぜひScenePhaseをお試しください!