読者です 読者をやめる 読者になる 読者になる

iOSアプリのライフサイクルについて

最近、業務で、未起動状態/background状態から通知(push通知、Beaconの検出等)経由で 起動するような動作がメインとなるアプリの実装をしたんですが、ちょっと曖昧なところがあったので、確認。

iOSアプリの状態

iOSは大きく分けて以下の5つの状態がある。

  • Not running
  • Inactive
  • Active
  • Background
  • Suspended

Not running

アプリが起動していない状態や、OSによって終了された状態。

Inactive

アプリがForegroundにいるが、ユーザーが操作することのできない状態。
通知センター表示や、Control Centerの表示、ホームボタンをタップして アプリがbackgroundに入るまでの一瞬もこれに含まれる。

Active

アプリがForegroundにおり、ユーザーが操作することのできる状態。
通常、ユーザーがアプリに触れるのはこの状態。

Background

アプリがbackgroundにおり、実行されている状態。
通常、Suspendedに移行する過程としてこの状態に入るが、Background Modesが定義されている場合、この状態が続く。

Suspended

アプリがbackgroundにいるが、実行されていない状態。
アプリがbackgroundに回ると、10秒ほどでBackgroundを経てSuspendedに移行する。


上記の状態間の関係をまとめたものが以下の図です。
これを読んでおけば、アプリの状態遷移について無駄な時間を使うことも少なくなりそうです。 f:id:nerd0geek1:20160116204247p:plain

出典:Execution States for Apps

それ以外では、SuspendedからNot Runningへの状態移行について以下のような記述があり、ユーザーがアプリを終了させるタイミングで何らかの処理を実行するということができない、と明言されていることが今回のドキュメント読込の大きな収穫でした。

In addition to the system terminating your app, the user can terminate your app explicitly using the multitasking UI. User-initiated termination has the same effect as terminating a suspended app. The app’s process is killed and no notification is sent to the app

参考

Execution States for Apps(Apple公式)