iOS におけるバックグラウンド処理の概要
iOS はバックグラウンド処理を非常に厳密に制御しており、その実装には 3 つのアプローチが提供されています。
- バックグラウンド タスクを登録する - アプリケーションが重要なタスクを完了する必要がある場合は、そのアプリケーションがバックグラウンドに移動した際に、そのタスクを中断しないように iOS に要求できます。 たとえば、アプリケーションでユーザーのログインを完了する、または大きなファイルのダウンロードを完了する必要がある場合があります。
- バックグラウンドで必要なアプリケーションとして登録する - アプリは、"オーディオ"、"ボイス オーバー IP"、"外部アクセサリ"、"Newsstand"、"位置情報" など、既知の特定のバックグラウンド要件を持つ、特定の種類のアプリケーションとして登録できます。 これらのアプリケーションは、登録されたアプリケーションの種類のパラメーターの中にあるタスクを実行している限り、継続的なバックグラウンド処理の特権を許可されます。
- バックグラウンド更新を有効にする - アプリケーションは、"リージョンの監視" を使用するか、"重要な場所の変更" をリッスンして、バックグラウンド更新をトリガーできます。 iOS 7 の時点で、アプリケーションは "バックグラウンド フェッチ" または "リモート通知" を使用して、バックグラウンド内でコンテンツを更新するために登録することもできます。
アプリケーションの状態とアプリケーション デリゲート メソッド
iOS でのバックグラウンド処理のコードについて説明する前に、バックグラウンド処理が iOS アプリケーションのライフサイクルにどのように影響するかを理解する必要があります。
iOS アプリケーションのライフサイクルは、アプリケーションの状態とそれらの間を移動するためのメソッドのコレクションです。 アプリケーションは、ユーザーの動作とアプリケーションのバックグラウンド要件に基づいて状態を切り替えます。 この動きを次のダイアグラムに示します。
- 停止中 - アプリケーションはまだデバイス上で起動されていません。
- 実行中/アクティブ - アプリケーションは画面上にあり、フォアグラウンド内でコードを実行しています。
- 非アクティブ - アプリケーションは、着信電話、テキスト、その他の割り込みによって中断されます。
- バックグラウンド - アプリケーションはバックグラウンドに移動し、引き続きバックグラウンド コードを実行します。
- 中断 - アプリケーションにバックグラウンドで実行するコードがない場合、またはすべてのコードが完了した場合、そのアプリは OS によって "中断" されます。 中断されたアプリケーションのプロセスは維持されますが、この状態ではアプリケーションはコードを何も実行できません。
- 停止中に戻る/終了 (まれ) - 場合によっては、アプリケーションのプロセスが破棄され、そのアプリケーションが "停止中" 状態に戻ることがあります。 これは、メモリ不足の状況において、またはユーザーがアプリケーションを手動で終了した場合に発生します。
マルチタスクのサポートが導入されて以来、iOS はアイドル状態のアプリケーションをほとんど終了せず、代わりにそれらのプロセスをメモリ内で "中断" したままにします。 アプリケーションのプロセスを有効な状態で維持すると、ユーザーが次回にそのアプリケーションを開くとすぐに起動することが保証されます。 これは、アプリケーションはシステム リソースを消費することなく、"中断" 状態から "バックグラウンド" 状態に自由に移動して戻れることを意味します。 iOS 7 では、デバイスがスリープ状態になった際にアプリケーションでのバックグラウンド タスクの一時停止、ユーザー操作なしでバックグラウンドから直接コンテンツの更新などができる、新しい API でこの機能が使用されます。 「iOS バックグラウンド処理のテクニック」の中で新しい API について説明します。
アプリケーション ライフサイクル メソッド
アプリの状態が変わると、iOS は AppDelegate
クラス内のイベント メソッドを使用してアプリケーションに通知します。
OnActivated
- これは、アプリケーションが初めて起動される際と、そのアプリがフォアグラウンド内に戻るたびに呼び出されます。 これは、アプリを開くたびに実行する必要があるコードを記述する箇所です。OnResignActivation
- ユーザーがテキストや電話などの中断を受け取った場合にこのメソッドが呼び出され、アプリは一時的に非アクティブになります。 ユーザーが電話に出ると、そのアプリはバックグラウンドに送られます。DidEnterBackground
- アプリがバックグラウンド状態になると呼び出されます。このメソッドでは、アプリケーションは約 5 秒で、起こりうる終了に備えます。 この時間を使用して、ユーザー データとタスクを保存し、画面から機密情報を削除します。WillEnterForeground
- バックグラウンドのまたは中断されたアプリケーションにユーザーが戻り、それがフォアグラウンドで起動するとWillEnterForeground
が呼び出されます。 これは、DidEnterBackground
の間に保存されたすべての状態をリハイドレートすることで、フォアグラウンドを使用するようにアプリを準備する時間です。 このメソッドが完了した直後にOnActivated
が呼び出されます。WillTerminate
- アプリケーションはシャットダウンされ、そのプロセスは破棄されます。 このメソッドは、マルチタスキングがそのデバイスまたはその OS バージョンで使用できない場合、メモリが不足している場合、またはユーザーがバックグラウンドのアプリケーションを手動で終了した場合にのみ呼び出されます。 終了される、中断したアプリケーションは、WillTerminate
を呼び出さないことに注意してください。
次のダイアグラムでは、アプリケーションの状態とライフサイクルメソッドがどのように組み合わされているかを示します。
iOS でのバックグラウンド処理用ユーザー コントロール
iOS 7 では、ユーザーがアプリケーションのバックグラウンド状態をより詳細に制御できるように、いくつかの機能が導入されました。 "App スイッチャー" と "App のバックグラウンド更新" 設定の両方が、アプリケーション ライフサイクルに影響します。
App スイッチャー
App スイッチャーは、iOS 7 で導入された重要なコントロール機能です。 ホーム ボタンをダブルタップすると起動し、プロセスが有効なアプリケーションを表示します。
App スイッチャーを使用して、ユーザーはバックグラウンドにある、および中断された、すべてのアプリケーションのスナップショットをスクロールできます。 ひとつのアプリケーションをタップすると、フォアグラウンドでそれが起動します。 スワイプすると、そのアプリケーションはバックグラウンドから削除され、そのプロセスは終了します。 次のセクションの「iOS のアプリケーション ライフサイクル デモ」の中で、App スイッチャーについて詳しく見ていきます。
重要
App スイッチャーには、バックグラウンドにあるものと中断されたアプリケーションの違いは表示されません。
App のバックグラウンド更新設定
iOS 7 では、バックグラウンド処理に登録されたアプリケーションのバックグラウンド処理をユーザーが削除できるようにすることで、アプリケーション ライフサイクルのユーザー制御が向上しています。 これにより、アプリケーションのバックグラウンド タスク実行が妨げられることはありません。
ユーザーは、[設定] > [一般] > [App のバックグラウンド更新] に移動し、選択したアプリケーションのバックグラウンド特権を編集することで、この設定を変更できます。 App のバックグラウンド更新がオフに設定されている場合、そのアプリケーションはバックグラウンドに入るとすぐに中断され、バックグラウンド処理が何も実行されなくなります。
開発者は BackgroundRefreshStatus
API を使用して、アプリケーションのバックグラウンド更新状態をチェックできます。 例については、「Check Background Refresh Setting recipe」を参照してください。
iOS アプリケーション ライフサイクルの基本と、アプリケーション ライフサイクルを制御するための機能について説明しました。 次に、iOS アプリケーションライフサイクルの動作を見てみましょう。