【Swift UI】ScenePhaseの使い方!フォアグラウンド/バックグラウンドの検知

【Swift UI】ScenePhaseの使い方!フォアグラウンド/バックグラウンドの検知

この記事からわかること

  • Swift UIScenePhase使い方
  • アプリフォアグラウンドバックグラウンドであることを検知する方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

ScenePhaseの使い方

公式リファレンス:ScenePhase

Swift UIではアプリがフォアグラウンドやバックグラウンドで動作していることを列挙型ScenePhaseの値で識別することが可能です。ScenePhase型には@Environmentを使用して環境変数として参照することが可能です。

@Environment(\.scenePhase) private var scenePhase

おすすめ記事:【Swift UI】@Environmentとは?使い方と使用可能なキー値一覧

Swift UIに実際に組み込む場合は以下のようになります。

struct ContentView: View {
    
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some View {
        Text("Hello World")
            .onChange(of: scenePhase) { phase in
                switch phase {
                case .active:
                    print("フォアグラウンド")
                case .inactive:
                    print("フォアグラウンド(作業を一時停止する必要)")
                case .background:
                    print("バックグラウンド")
                @unknown  default:
                    print("不明")
                }
            }
    }
}

ScenePhase以下の3つの値を持っていますアプリを閉じた場合など状態が切り替わるたびに値は変化していくのでonChangeを使用して値の変化を観測することで検知することが可能です。

enum ScenePhase {
  case active     // フォアグラウンド
  case inactive   // フォアグラウンド(作業を一時停止する必要)
  case background // バックグラウンド
}

NotificationCenterを使用して識別する

scenePhaseを使用した方法はSwift UIに依存しているのでクラスなどにまとめたい際に使いにくいです。なのでどこでも使いやすいようにNotificationCenterを使用することでアプリの状態を管理するクラスを作成してみます。

NotificationCenterからpublisherメソッドを使用します。引数forには観測したいイベントNSNotification.Name型を渡します。

class AppState {
    
    private var cancellables = Set<AnyCancellable>()
    
    init() {
        NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)
            .sink { _ in
                print("アプリがアクティブになった")
            }
            .store(in: &cancellables)
        
        NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)
            .sink { _ in
                print("アプリが非アクティブになった")
            }
            .store(in: &cancellables)
        
        NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)
            .sink { _ in
                print("アプリがバックグラウンドになった")
            }
            .store(in: &cancellables)
        
        NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)
            .sink { _ in
                print("アプリがフォアグラウンドになった")
            }
            .store(in: &cancellables)
    }
}

例えばSwift UIで使用するならインスタンス化するだけです。onAppearの中でインスタンス化してもすぐに破棄されてしまい観測できないので注意してください。

struct ContentView: View {
    private let state = AppState()
    var body: some View {
        Text("Test")
    }
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index