[iOS] アプリを開いた状態で端末をスリープ(ロック)にした場合のライフサイクル遷移
アプリを開いた状態から、閉じずにそのまま端末をスリープしロック画面に入った際のライフサイクル遷移をまとめる。
Always on (常時点灯)の有無、SwiftUIとUIKitで異なる遷移をする点に注意が必要。
結果
下記表では、アプリを開いた状態からスタートし、そのままスリープ(ロック画面)に入るまでのライフサイクル遷移を示す。
ScenePhase
+ WindowGroup.onChnage(of:)
常時点灯 有効 | 常時点灯 無効 (常時点灯機能がない端末含む) |
---|---|
inactive ↓ active ↓ inactive ↓ background
|
inactive ↓ background
|
ScenePhase
+ WindowGroup
以外のViewでonChnage(of:)
常時点灯 有効 | 常時点灯 無効 (常時点灯機能がない端末含む) |
---|---|
inactive ↓ active ↓ background
|
background |
UISceneDelegate
(UIKitベース)、UIScene
/UIAppilcation
のnotifiction
常時点灯 有効 | 常時点灯 無効 (常時点灯機能がない端末含む) |
---|---|
deactive ↓ active ↓ deactive ↓ background
|
deactive ↓ background
|
常時点灯が有効な場合は、background
になる前に一度active
の状態が挟まる。
その後、UISceneDelegate
(UIKitベース)やUIScene
/UIAppilcation
のnotifictionでは、順当にdeactive
になってからbackground
に行き着く。
また、ScenePhase
(SwiftUIベース)では、WindowGroup
に直接onChange(of: scenePhase)
を付けると、同じく順当にinactive
になってからbackground
に行き着く。
ただし、WindowGroup
の子孫のViewでonChange(of:)
を利用すると、inactive
状態にはならずそのままbackground
に行き着く。
常時点灯が無効な場合も、ScenePhase
+ WindowGroup
と、UISceneDelegate
や各種notificationは、順当にinactive
(deactive
)になってからbackground
に行き着くが、ScenePhase
+ WindowGroup
以外のViewはいきなりbackground
になる。
ScenePhase
しか監視していない場合、「background
になる直前は常にinactive
になる」と仮定した実装をしていると思わぬ挙動になり得る。
補足
UIKitベースのUIApplicationDelegate
の実装クラス、SwiftUIベースのUIApplicationDelegateAdaptor
のDelegateType
で指定するクラスのライフサイクル系のデリゲートメソッドは呼び出されなかった。
これは、ライフサイクル系のデリゲートメソッドがUISceneDelegate
側に吸収された結果である。
(SwiftUIでは、内部的にSwiftUI.AppSceneDelegate
というUISceneDelegate
の実装クラスが存在する。)
調査方法
- iPhone 15 Pro (iOS 17.1.1), iPhone 14 Pro (iOS 17.1.1), iPhone 13 Pro (iOS 16.7.2), iOS Simulatorで検証
- SwiftUIベースとUIKitベースのアプリ両方でライフサイクル系の各種状態やメソッド、通知を監視
- SwiftUIベース:
-
ScenePhase
+onChange(of:)
-
UIApplicationDelegateAdaptor
-
UIApplicationDelegate
を実装したクラスで下記デリゲートメソッドの呼び出しを監視
-
-
- UIKitベース:
-
UISceneDelegate
を実装したクラスで下記デリゲートメソッドの呼び出しを監視 -
UIApplicationDelegate
を実装したクラスで下記デリゲートメソッドの呼び出しを監視- SwiftUIベースに同じ
-
- 共通:
-
UIScene
のnotificationを購読 -
UIApplication
のnotificationを購読
-
- SwiftUIベース:
Discussion