今回は iOS アプリがどのようなライフサイクルで動いているのかを簡単にまとめて行きたいと思います。なんとなくボヤッとした感じでライフサイクルを認識していた人はぜひ目を通してみてください🙃
アプリの状態
状態 | 内容 |
---|---|
Not running | アプリは開始されていません |
Inactive | アプリケーションはフォアグラウンドで実行されていますが、イベントは受信しません。電話やメッセージを受け取った時や Active State から別の状態に切り替わる時に少しの間この状態になります。UI の操作は行うことができません。 |
Active | アプリケーションはフォアグラウンドで実行されていて、イベントの受信もしています。Inactive を経由することで状態の切り替えが可能です。 |
Background | アプリケーションはバックグラウンドにあり、コードは実行されます。通常、アプリを開いて、ホームボタンがタップされた時などに5秒ほどこの状態になり、Suspended 状態に移動します。また、5秒以上かかるタスクを行いたい場合時間を Backgroud 状態の時間を延長させることも可能です(ただ、10分を越すような長いタスクの場合は強制的に Suspended になる) |
Suspended | アプリケーションはバックグランドにあり、コードは実行されません。システムは自動的にアプリをこの状態に移行します(この移行に関する通知はありません)。システムのメモリが不足している場合、この状態のアプリケーションはメモリから削除され、アプリが Not running 状態になる可能性もあります。 |
※ Project の Capability
で Background Modes
を設定することで、例外的にバックグランドで長時間タスクを実行することも可能です。(ex. YouTube, Maps)
ライフサイクル
通常起動時
Not running -> Inactive -> Active
アプリ起動時にホームボタンをタップ
Active -> Inactive -> Background -> Suspended
サスペンド状態から起動された時(メモリ内にアプリがある場合)
Suspended -> Background -> Inactive -> Active
システムによってメモリから削除された場合(Suspended時)
Suspended -> Not running
Delegate Methods
delegate | 内容 |
---|---|
application(_:willFinishLaunchingWithOptions) | 起動プロセスが開始されたことを通知します。 |
application(_:didFinishLaunchingWithOptions:) | 起動プロセスがほぼ完了し、アプリを実行する準備がほぼ整ったことを通知します。 |
applicationDidBecomeActive(_application:) | アプリが Active 状態になったことを通知します。 |
applicationWillResignActive(_application:) | アプリが Active 状態から Inactive に移行しようとしていることを通知します。 |
applicationDidEnterBackground(_application:) | アプリが Background 状態になったことを通知します(Inactive -> Background 通知)。このメソッドが呼ばれてから約5秒後に Suspended 状態になります。追加の時間が必要な場合は beginBackgroundTask(expirationHandler:) を呼び出してシステムに追加の時間を要求します。タスクの実行が長すぎる場合は強制的に Suspended 状態に移行します。 |
applicationWillTerminate(_ application: UIApplication) | アプリが終了され、メモリから完全に削除されることを通知します。タスクの実行時間が長すぎる場合は、プロセスは強制的に終了させられます。 |
通常起動時
application(_:willFinishLaunchingWithOptions)-(Inactive)
application(_:didFinishLaunchingWithOptions:)-(Inactive)
applicationDidBecomeActive(_application:)-(Active)
アプリ起動時にホームボタンをタップ
applicationWillResignActive(_application:)-(Active)
applicationDidEnterBackground(_application:)-(Background)
...アプリ終了して、メモリから完全に削除される直前
applicationWillTerminate(_application:)-(Background)
サスペンド状態から起動された時(メモリ内にアプリがある場合)
applicationWillEnterForeground(_application:)-(Background)
applicationDidBecomeActive(_application:)-(Active)
参考
- https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
- https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background
- https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/extending_your_app_s_background_execution_time
- https://gori.me/ios/ios-news/12808
- https://hackernoon.com/application-life-cycle-in-ios-12b6ba6af78b
- https://qiita.com/KenNagami/items/766d5f95940c76a8c3cd
- https://qiita.com/ya8612tec/items/52a39054eadc4742c267