[SwiftUI] アプリの状態を表す ScenePhase

SwiftUI2021

     

TAGS:

⌛️ < 1 min.

SwiftUI で アプリの状態を表す ScenePhase について確認します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS14.5 Beta
  • Xcode 15.3
  • iOS 17.4
  • Swift 5.9

ScenePhase

SwiftUI で Scene の状態を表す型として使用されます。


参考
ScenePhaseApple Developer Documentation

enum として定義されていて 値としては以下を取り得ます。
・active
・inactive
・background

それぞれ以下のような意味です(意訳)。

active
フォアグラウンドで動作していて操作可能状態
inactive
フォアグラウンドで動作しているが、停止中
background
UI には表出していない状態

SwiftUI で ScenePhase を参照する

Scene は、SwiftUI の View からは、以下のように Environment の1つとして参照できるようになっています。

@Environment(\.scenePhase) private var scenePhase

たとえば、scenePhase が変わるごとに 何か処理をするのであれば 以下のようになります。

import SwiftUI

@main
struct MyApp: App {
    @Environment(\.scenePhase) var scenePhase

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase, {
           // process something
        })
    }
}

ScenePhase を使うケース1例

ScenePhase は アプリの状態を表現しているので、さまざまなケースで使用されそうです。

以下では、1つの例として AppTransparancyTracking の 許諾ダイアログを出すときを考えます。

許諾ダイアログは、ATTrackingManager.requestTrackingAuthorization という API を使用して表示します。


参考
requestTrackingAuthorization(completionHandler:)Apple Developer Documentation

ドキュメントにも記載されていますが、この API は、アプリケーションの状態が、Active のときに呼び出すことが必要です。

ドキュメントでは、UIApplicationStateActive で説明されていますが、用意されている状態から考えても、scenePhase も UIApplicationStateActive と同じ様に更新されるように思えます。(ドキュメントでの説明はありません)

以下のようにすることで、許諾ダイアログを表示することができるようになります。

@main
struct MyApp: App {
    @Environment(\.scenePhase) var scenePhase

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase, initial: true, {
            if scenePhase == .active {
                Task { @MainActor in
                    let state = await ATTrackingManager.requestTrackingAuthorization()
                    // process along state
                }
            }
        })
    }
}

以前は、UIApplicationDelegate を指定して applicationDidBecomeActive を使わないと実装できなかったことも、scenePhase を使うことで、
UIApplicationDelegate なしで できるようになりました。

まとめ

SwiftUI で アプリの状態を表す ScenePhase

SwiftUI で アプリの状態を表す ScenePhase
  • Scene の状態を表す
  • Environment として提供されている
  • active, inactive, background という状態を取り得る

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です