iOSのライフサイクルについて
⚙️アプリのライフサイクルの管理
アプリが前景または背景にある場合にシステム通知に応答し、その他の重要なシステム関連イベントを処理します。
📕概要
アプリの現在の状態によって、そのアプリがいつ何を行えるかが決まります。たとえば、前景にあるアプリはユーザーの注意を引いているため、CPUを含むシステムリソースに優先順位があります。対照的に、背景にあるアプリは画面外にあるため、できる限り少ない作業を行う必要があります。アプリが状態から状態へと変化するにつれて、その振る舞いを適切に調整する必要があります。
アプリの状態が変化すると、UIKit は適切なデリゲートオブジェクトのメソッドを呼び出すことで通知します。
iOS 13 以降では、シーンベースのアプリでのライフサイクルイベントに応答するために UISceneDelegate オブジェクトを使用します。
iOS 12 以前では、ライフサイクルイベントに応答するために UIApplicationDelegate オブジェクトを使用します。
🚨注意
アプリでシーンサポートを有効にした場合、iOS 13 以降では常にシーンデリゲートが使用されます。iOS 12 以前では、システムはアプリデリゲートを使用します。
シーンベースのライフサイクルイベントに応答する
アプリがシーンをサポートしている場合、UIKit はそれぞれに独立したライフサイクルイベントを提供します。シーンは、デバイス上で実行されているアプリの UI のインスタンスを表します。ユーザーは、1つのアプリに複数のシーンを作成し、それぞれを個別に表示および非表示にすることができます。各シーンは独自のライフサイクルを持つため、それぞれが異なる実行状態にあることがあります。たとえば、1つのシーンが前景にある一方で、他のシーンが背景にあるか、または一時停止している場合があります。
重要
シーンサポートはオプトイン機能です。基本的なサポートを有効にするには、アプリの Info.plist ファイルに UIApplicationSceneManifest キーを追加し、アプリがサポートするシーンを指定する手順に従ってください。
以下の図は、シーンの状態遷移を示しています。ユーザーまたはシステムがアプリに新しいシーンを要求すると、UIKit がそれを作成し、未接続状態に配置します。ユーザー要求のシーンは迅速に前景に移動し、画面上に表示されます。システム要求のシーンは通常、イベントを処理するために背景に移動します。たとえば、システムは位置情報イベントを処理するためにシーンをバックグラウンドで起動する場合があります。ユーザーがアプリの UI を閉じると、UIKit は関連するシーンを背景状態に移動し、最終的に中断状態に移行します。UIKit は、いつでもバックグラウンドまたは中断状態のシーンを切断してそのリソースを回収し、そのシーンを未接続状態に戻すことができます。
シーンの遷移を使用して、次のタスクを実行します。
-
UIKit がシーンをアプリに接続する際に、シーンの初期 UI を設定し、シーンが必要とするデータを読み込みます。
-
前景アクティブ状態に遷移する際に、UI を設定し、ユーザーとの対話の準備を行います。前景で実行する UI の準備を参照してください。
-
前景アクティブ状態から離れるときに、データを保存し、アプリの動作を静かにします。バックグラウンドで実行する UI の準備を参照してください。
-
バックグラウンド状態に入るときに、重要なタスクを完了し、できるだけ多くのメモリを解放し、アプリのスナップショットの準備をします。バックグラウンドで実行する UI の準備を参照してください。
-
シーンが切断されたときに、シーンに関連する共有リソースをクリーンアップします。
また、シーンに関連するイベントに加えて、UIApplicationDelegate オブジェクトを使用してアプリの起動に応答する必要があります。アプリの起動時に行うべきことについては、「アプリの起動に応答する」を参照してください。
🔔アプリベースのライフサイクルイベントに応答する
iOS 12 以前およびシーンをサポートしていないアプリでは、UIKit はすべてのライフサイクルイベントを UIApplicationDelegate オブジェクトに配信します。アプリデリゲートは、別々の画面に表示されるウィンドウを含む、アプリのすべてのウィンドウを管理します。その結果、アプリの状態遷移は、外部ディスプレイ上のコンテンツを含むアプリ全体の UI に影響します。
以下の図は、アプリデリゲートオブジェクトを介した状態遷移を示しています。起動後、システムはアプリを非アクティブまたはバックグラウンド状態にしますが、これは UI が画面上に表示されるかどうかによって異なります。前景に起動する場合、システムはアプリを自動的にアクティブ状態に遷移させます。その後、アプリは終了するまで、アクティブとバックグラウンドの間を往復します。
アプリの遷移を使用して、以下のタスクを実行します。
-
起動時に、アプリのデータ構造と UI を初期化します。アプリの起動に応答するを参照してください。
-
アクティベーション時に、UI を構成し、ユーザーとの対話の準備をします。前景で実行する UI の準備を参照してください。
-
非アクティベーション時には、データを保存し、アプリの動作を静かにします。バックグラウンドで実行する UI の準備を参照してください。
-
バックグラウンド状態に入るときに、重要なタスクを完了し、できるだけ多くのメモリを解放し、アプリのスナップショットの準備をします。バックグラウンドで実行する UI の準備を参照してください。
-
終了時には、すべての作業を即座に停止し、共有リソースを解放します。applicationWillTerminate: を参照してください。
その他の重要なイベントに応答する
ライフサイクルイベントの処理に加えて、アプリは以下の表にリストされているイベントに対応する準備をする必要があります。これらのイベントのほとんどは UIApplicationDelegate オブジェクトを使用して処理します。一部の場合、通知を使用してこれらのイベントに対応し、アプリの他の部分から応答することもできます。
専門用語 | 解説 |
---|---|
メモリ警告 | アプリのメモリ使用量が高すぎる場合に受信されます。アプリのメモリ使用量を減らしてください。メモリ警告に応答するを参照してください。 |
保護されたデータが利用可能になる/利用不可になる | ユーザーがデバイスをロックまたはアンロックしたときに受信されます。applicationProtectedDataDidBecomeAvailable: および applicationProtectedDataWillBecomeUnavailable: を参照してください。 |
ハンドオフタスク | NSUserActivity オブジェクトの処理が必要な場合に受信されます。application:didUpdateUserActivity: を参照してください。 |
時刻変更 | 電話キャリアが時刻の更新を送信したときなど、さまざまな時間の変更のために受信されます。applicationSignificantTimeChange: を参照してください。 |
URL のオープン | アプリがリソースを開く必要があるときに受信されます。application:openURL:options: を参照してください。 |
最後に
iOSアプリのライフサイクルについて理解する必要がありまして、日本語の解説で参考になりそうなものがなくて、公式を翻訳して作ってみました。
Discussion