iOSアプリの状態と遷移を理解する - TechRepublic

iOSアプリの状態と遷移を理解する - TechRepublic

iOS 4.0以降で動作するように開発されたすべてのアプリは、バックグラウンドで処理を実行できます。これは当然のことながら、開発者がメモリ管理やiOSアプリの効率化を図るための選択肢が広がることを意味します。オペレーティングシステムは各iOSアプリと常に通信し、アプリに必要な調整を行うための情報を渡します。すべての開発者にとって、アプリケーションの状態の概念と、遷移を処理するために実装すべき5つの重要なアプリケーションメソッドを理解することが重要です。

初期のiOSバージョン(iOS 4.0以前)向けに開発されたアプリは、非実行非アクティブアクティブの3つの状態をサポートしていました。iOS 4.0以前のアプリのアプリケーションデリゲートは、applicationDidFinishLaunchingとapplicationWillTerminateという2つの重要なメソッド呼び出しを受け取りました。アプリがapplicationDidFinishLaunchingメッセージを受信すると、前回の起動情報を取得し、アプリを最後に使用された状態に復元する機会が与えられました。ステータス(applicationWillTerminate)は、アプリがシャットダウンの準備をしていることをアプリに通知するために使用されました。これにより、開発者は未保存のデータや特定の状態情報を保存できるようになりました。

現在、アプリが遷移の準備(シャットダウンやバックグラウンドへの移行など)を行う原因となるアプリケーション状態は5つあります。場合によっては、アプリはバックグラウンドで処理を継続する必要があるかもしれません。しかし、アプリがグラフィック、アニメーション、またはディスプレイ固有のルーチンを処理する必要はまったくありません。iOSアプリのプログラミングガイドに記載されている5つの状態は、以下のとおりです。

  1. 非実行– アプリは実行されていません。
  2. 非アクティブ– アプリはフォアグラウンドで実行されていますが、イベントを受信して​​いません。iOS アプリは、通話や SMS メッセージの受信時などに非アクティブ状態になることがあります。
  3. アクティブ– アプリはフォアグラウンドで実行されており、イベントを受信して​​います。
  4. バックグラウンド– アプリはバックグラウンドで実行され、コードを実行しています。
  5. 一時停止– アプリはバックグラウンドにありますが、コードは実行されていません。

最も重要な7つのアプリケーションデリゲートメソッド

オペレーティングシステムは、アプリケーションデリゲート内の特定のメソッドを呼び出し、様々な状態間の遷移を容易にします。開発者が処理すべき最も重要な7つのアプリケーションデリゲートメソッドは次のとおりです。

アプリケーション:オプション付き起動を完了します

起動プロセスが開始されたときに呼び出されるメソッド。これは、アプリ内でコードを実行する最初の機会です。

アプリケーション:didFinishLaunchingWithOptions

起動プロセスがほぼ完了したときに呼び出されるメソッドです。このメソッドはアプリのウィンドウが表示される前に呼び出されるため、インターフェースの準備と最終的な調整を行う最後の機会となります。

アプリケーションがアクティブになりました

アプリケーションがアクティブになると、アプリケーション デリゲートはメソッド applicationDidBecomeActive を介してコールバック通知メッセージを受信します。

このメソッドは、結果として生じる電話の呼び出しまたは SMS によってアプリが非アクティブ状態に切り替わった後、アクティブ状態に戻るたびにも呼び出されます。

アプリケーションは再辞職します

applicationWillResignActive メソッドが呼び出される条件はいくつかあります。電話の着信など、一時的なイベントが発生するたびに、このメソッドが呼び出されます。また、iOS アプリを「終了」してもプロセスは終了せず、アプリがバックグラウンドに移動される点にも注意してください。

アプリケーションがバックグラウンドに入った

このメソッドは、iOSアプリが実行中だがフォアグラウンドではなくなったときに呼び出されます。つまり、ユーザーインターフェースは現在表示されていません。AppleのUIApplicationDelegateプロトコルリファレンスによると、アプリは約5秒以内にタスクを実行して制御を戻さなければなりません。メソッドが5秒以内に制御を戻さない場合、アプリは終了します。

アプリケーションがフォアグラウンドに入る

このメソッドは、アプリがバックグラウンドからフォアグラウンドに移行する準備をしているときに呼び出されます。ただし、applicationDidBecomeActiveメソッドが呼び出されない限り、アプリはアクティブ状態に移行しません。このメソッドにより、開発者はアプリがアクティブになる前に、以前の実行状態の設定を再確立することができます。

アプリケーションは終了します

このメソッドは、終了イベントがトリガーされたときにアプリケーションデリゲートに通知します。ホームボタンを押してもアプリケーションは終了しなくなりました。iOSアプリを強制終了するか、デバイスをシャットダウンすると、applicationWillTerminateメソッドがトリガーされます。このメソッドは、アプリケーションの構成、設定、およびユーザー設定を保存する機会となります。

アプリケーションの状態の変化

すべてのiOSアプリは常に5つの状態のいずれかにあります。アプリの状態はオペレーティングシステムによって管理されますが、アプリ自体も状態間のスムーズな遷移を実現するための重要なタスクを管理する責任を負っています。開発者はアプリの状態遷移に適切に対応することが求められます。

最新のiOSでは、マルチタスク機能により、各アプリが利用できるリソースが適切に管理されます。ただし、OSによってアプリがバックグラウンドで実行できる動作が制限される点にご注意ください。アプリをバックグラウンドで(機能が制限された状態で)継続実行する必要がある場合は、許可をリクエストする必要があります。

アプリの起動

ユーザーがアプリアイコンをタップした瞬間、アプリの状態が変化し始めます。アプリデリゲートは application:willFinishLaunchingWithOptions メソッド呼び出しを受け取り、アプリの状態は非実行状態から非アクティブ状態に変わります。非アクティブ状態になると、アプリデリゲートは application:didFinishLaunchingWithOptions メソッド呼び出しを受け取り、インターフェースが表示される前に最終的な調整を行う機会が与えられます。アプリがバックグラウンドで起動するように設計されていない場合、オペレーティングシステムはアプリをアクティブ化し、アプリの状態をアクティブに設定し、アプリデリゲートに applicationDidBecomeActive メソッド呼び出しを送信します。

中断

iOSアプリは、割り込みへの対応が必要になる場合があります。例えば、電話の着信など、アラートベースの割り込みが発生すると、アプリは非アクティブ状態に移行します。アプリのデリゲートは applicationWillResignActive メソッドの呼び出しを受け取り、一時的な非アクティブ状態に備える機会を得ます。ユーザーが割り込みを無視した場合、または割り込み元のプロセスが終了した場合、アプリはアクティブ状態に戻ります。非アクティブ状態からアクティブ状態への移行中に、アプリのデリゲートは applicationDidBecomeActive メソッドの呼び出しを受け取ります。

背景に切り替える

iOSデバイスでは、アプリ間の切り替えが簡単に行えます。ユーザーが別のアプリに切り替えると、現在のアプリはバックグラウンドに移行します。アプリは、バックグラウンドまたはサスペンドのいずれかの状態になります。どちらの場合も、バックグラウンドに移行する前に、アプリデリゲートは applicationWillResignActive メソッドの呼び出しと、それに続く applicationDidEnterBackground メッセージを受け取ります。サスペンド状態の場合、アプリはスリープ状態になります。バックグラウンド状態(アプリがコードの実行を継続できる状態)では、アプリはイベントを監視して処理する必要があります。開発者は、オペレーティングシステムがいつでもアプリを終了する可能性があることに注意する必要があります。

最後に一言

AppleのiOSは、最も直感的でユーザーフレンドリーなオペレーティングシステムの一つです。開発者がベストプラクティスに従う限り、ユーザーエクスペリエンスは一貫性を保ち、トラブルフリーです。高度に進化したアプリは、オペレーティングシステムとiOSアプリ間の継続的な通信を最大限に活用しています。遷移メッセージを監視したり、アプリのさまざまな状態に対応したりするのに、ほとんど手間はかかりません。少しの注意が大きな効果をもたらします。

こちらもお読みください:

  • iOS開発でデザインパターンを使用する利点
  • ベストプラクティス: 異機種混在iOSアプリの開発
  • Xcode iOS のデフォルトアプリケーションテンプレートの概要
Tagged: