今回は最近各所で話題になっているiBeaconの、デバイスにおける状態と動作制限についてまとめたいと思います。
更新:iOS7.1では変更点があります。詳細はこちらを参照してください。
iOS7.1でのiBeaconが改善されまくった話
#iBeaconの概念
iBeaconにはRangeとRegionという2つの概念がある。
-
Range : iBeacon発信機からの距離などが計算できる程度の精度を持つ情報を取得できる (CoreBluetoothを使用: 様々な情報が得られます)
-
Region : iBeacon発信機の電波が入ることを認識できる (CoreLocationを使用: エリアに入った、エリアから出た、の情報のみが得られます)(didEnterRegion, didExitRegion)
この2つがあるということが重要で、これがごっちゃに説明されている文献も多いかと思います。
#なぜこれほどまでに話題になっているか
自分が思うにO2O(Online to Offline)においてかなり強力なソリューションになりうるからだと思います。
#iBeaconの受信
##受信アプリがフォアグランドの場合
フォアグランドで動いているアプリでiBeaconを受信する場合、約1秒間隔で、Range、Regionを取得します。
##受信アプリがバックグラウンドの場合
受信アプリがバックグラウンドの場合、CoreBluetoothを使う、Rangeは、バックグラウンドでは使用できないため使用できません。
しかし、CoreLocationを使うRegionはバックグラウンドで使用できます。
つまり、エリアに入った、エリアから出た、はわかるということです。
もともとiOS6時代はCoreLocationも、バックグラウンドにいるアプリでは頻繁に通信できないという制約がありましたが、
iOS7でiBeaconが導入されたからか、それが緩和されています。
バックグラウンドでも、1秒間隔で受信することが可能です。
Regionを元に、PushやPassbookと連携した機能を起動することができます。しかし、処理に約10秒のラグが存在します。
##受信アプリがバックグラウンドで動いていて、デバイスがロックされている場合
デバイスがロックされている場合でも、Regionは使うことができます。
Regionから連携アプリを起動することが可能です。
ただし、あくまで受信アプリがバックグラウンドで動いている必要があります。
##いつまでバックグラウンドアプリとして動くのか?
通常のアプリは、バックグラウンド移行後、10分間ユーザがなんの操作も行わない場合、スリープに移行してしまいます。
今回、実験で10分以上バックグラウンドで起動して放置しましたが、ログ上ではスリープに移行した形跡がありませんでした。(25分間放置で実験)
よって、何も処理をしないと、何も知らないユーザは、ずっと電池を消費し続けることになります。(白抜きの位置情報使用アイコンは右上に出続けますが…)
iPhone4Sの場合、1日放置したところ50%の電池を消費しました。
iPhone5Sの場合だと、1日放置しても5%程度の減少でした。
実装で明示的にBLEの使用を停止するようなことをしたほうがレビューが荒れずに済むかもしれません。
#iBeaconの送信
##発信アプリがフォアグランドの場合
できます。充電アダプタにつないでおかないとすぐ電池がきれます。
##発信アプリがバックグラウンドの場合
できません。発信はCoreBluetoothで行いますが、CoreBluetoothはバックグラウンドでは使用できません。
##発信アプリがバックグラウンド動いていてデバイスがロックされている場合
できません。理由は同上です。
#まとめ
基本的にはRegionに入ったか、出たかをイベントにした所作はバックグラウンドでもできるが、発信にはかなりの制限があることがわかったと思います。
また、リファレンスにある仕様が、実際に測定してみると満足な結果が得られない場合も多々あり、
Regionだけを用いたアプリを作成する場合は、この精度や条件で大丈夫かどうかを一考したほうが良さそうです。