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

iOSのBackground ModesとBackground Task

アプリのライフサイクルのポストもそうですが、ここらへんの認識が曖昧だったので、調査。

Background Modesとは?

Background Modesは、アプリを裏で動かし続けるための設定です。
通常、アプリが裏に回ると10秒程度で、Background状態からSuspended状態に移行しますが、 Background Modesが設定されているアプリでは、特定の処理の実行中はBackground状態が維持されます。
Background Modesが設定されているアプリには、以下のようなものがあります。

  • 音楽再生中のMusicアプリ(Audio, AirPlay and Picture in Picture)
  • Nike+ Running(Location Updates)

また、iOSで使えるBackground Modesには以下のものがあります。

  • Audio, AirPlay and Picture in Picture
  • Location Updates
  • Voice over IP
  • Newsstand downloads
  • External accessory communication
  • Uses Bluetooth LE accessories
  • Acts as a Bluetooth LE accessory
  • Background fetch
  • Remote notifications

Background ModesとBackground Task

上記の機能を使っている場合、機能を使っている間はBackground状態を維持することができますが、 それ以外のケースでもBackground状態を維持したいケースがあると思います。
そういった場合に使えるのが、Background Taskという仕組みです。
UIApplicationクラスのbeginBackgroundTaskWithName:expirationHandlerメソッドを呼び出すことで、 Background状態を3分(iOS7以降)維持することができます。
ただし、3分以内にendBackgroundTaskを呼び出さないと、アプリ自体が終了してしまいますので、その点に関しては注意が必要です。

アプリがbackgroundで起動された場合の挙動について

参考ドキュメントのUnderstanding When Your App Gets Launched into the Backgroundに詳しい記述がありますが、 ユーザーがMultitasking UIからアプリを終了した場合、アプリがシステムによって再度立ち上げられることはありません。 唯一の例外は、Location Updatesです。
このあたりの情報は、仕様決定時やデバッグ時に非常に役に立ちますので、覚えておくと良さそうです。

気になった点

Not Running状態のアプリがシステムにより起動された際に、別のBackground Modesの条件となる処理を呼び出すこと(例:Location Updatesのsignificant-change後に、音楽の再生を開始する等)により、Not Running状態のアプリを直接、Background状態にできないか調べてみたのですが、やはり、そういったことはできないようでした。。。
アプリのライフサイクルにおいても、そういったルートが用意されていないので、やはり一旦Foregroundにする必要はありそうですね。

参考