iBeaconを復習しよう!
本日はこれまでも何度か取り上げてきたiBeaconについて改めて復習してみたいと思います。
今回はiOS端末でのiBeaconの発信/受信に特化して書きます。
これまでの関連記事は以下です。
- 噂のiOS7.1でiBeaconを試してみよう!!
- iOS8でiBeaconを試してみよう!!
- Swiftを使って、iBeaconのCentralアプリを作ろう!!
- 複数のiBeacon信号を利用してみよう!
では、早速、まとめていきましょう。
iBeaconが利用可能な端末
- OS: iOS7.0以上
- 端末: iPhone4S以降, iPad(第3世代)以降, iPad mini以降, iPod touch(第5世代以降) ※もちろんiPad Airでも利用可能
iOSごとのiBeacon機能の差異
まずは動作面での差異について
- iOS7.0.xの場合
アプリをFG起動もしくはBG起動していないとiBeaconを検知することはできない - iOS7.1.x以降の場合
アプリを起動していない(停止状態の)場合でもiBeaconを検知可能
次にプログラミング面での差異について
プログラミング面ではCentral側にのみ多少の差異があります。
iBeaconの検知には CoreLocation.framework を利用します。
CoreLocation.framework は位置情報サービスを利用するためのフレームワークですが、iBeaconの領域監視メソッドが組み込まれています。
もともと、ジオフェンスの領域監視メソッドが組み込まれていますので、それと同等に扱いたいというApple側の意図が見えます。
具体的な差異について説明します。
位置情報サービスの利用許可メソッドをiOS8から組み込む必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
|
iOS7.xではstartMonitoringForRegion
メソッドを実行した段階でdidChangeAuthorizationStatus
メソッドが呼ばれます。
iOS8では、requestAlwaysAuthorization
メソッドを実行(位置情報サービスを常に許可する場合のメソッド)しなければ、didChangeAuthorizationStatus
メソッドが呼ばれないため、startMonitoringForRegion
メソッドの実行タイミングを変える必要が出てきました。
iBeacon関連メソッドの実行順について(Centralの場合)
先ほどiBeaconの検知は CoreLocation.framework 内のメソッドとして組み込まれていると説明しました。では、他にどんなメソッドがあるのでしょうか。
1 2 3 |
|
1 2 3 |
|
1 2 3 |
|
1 2 3 |
|
1 2 3 |
|
1 2 3 |
|
上記のメソッドを使えば十分なアプリが開発できるはずです。
さて、ここで注意しておくべきなのは、startRangingBeaconsInRegion
メソッドをどのタイミングで実行するかということです。
基本的には、 監視領域に入ったタイミング でstartRangingBeaconsInRegion
メソッドを実行するのが普通かもしれません。
しかし、この場合は注意が必要です。
なぜなら、監視領域内でアプリを落として、再度起動した場合、didEnterRegion
メソッドが実行されないからです。つまり、既に監視領域に入っている場合は 監視領域に侵入したと見なされない ということです。
よって、こういったケースがアプリの利用に打撃を与えるのであれば、 監視領域に入ったタイミング のみにstartRangingBeaconsInRegion
メソッドを置くわけにはいかないことになります。
その場合は、didDetermineState
メソッドで既に監視領域内にいる場合(state
がCLRegionStateInside
の場合)にstartRangingBeaconsInRegion
メソッドを実行するようにしましょう。
Peripheralの注意点
続いて、PeripheralとしてiOS端末を使う場合の注意点についてお話しておきます。
iOS端末ではアプリをFG起動している間のみiBeacon信号の発信が可能です。
アプリがBG起動になった場合、iBeacon信号の発信が止まってしまうため、数秒後にCentral側のiOS端末でdidExitRegion
メソッドが実行されます。
なので、iOS端末でPeripheralの役割を担いたいのであれば、FG起動を続けることに問題がない使い方である場合に限ります。
因みに、XcodeのBackground Modesで Act as a Bluetooth LE accessory を有効にしたとしても、BG起動中はiBeaconを発信することはできません。
また、 CoreBluetooth.framework にはiOS端末がiBeacon発信状態(アドバタイジング状態)かを判別するisAdvertising
プロパティが存在します。
iBeaconを発信している状態でアプリをBG起動にした場合はisAdvertising
は YES として返却されます。つまり、実際の状態と必ずしも一致するわけではないということです。
Centralの注意点
最後にCentralとしてiOS端末を使う場合の注意点についてお話しておきます。
iOS端末でiBeaconのレンジング処理を行う場合、FG起動時にしかレンジング処理を実行できません。
そのため、アプリの状態によらずレンジング処理が必要な仕様を実現することは不可能ということになります。
一応、didEnterRegion
メソッドやdidExitRegion
メソッドなどのデリゲートメソッドが実行された場合、約10秒間はアプリの状態によらずあらゆる処理が実行可能であるため、この間のみレンジング処理を実行してmajor
, minor
などの値を取得することは可能です。
正しい動作検証を実施した上でiBeaconを扱うようにしましょう。
各種設定がOFFの場合のアラート表示について
さて、直接iBeaconとは関係がありませんが、iOS端末をPeripheralとして扱う場合は Bluetoothの設定 をONにしておく必要があります。iOS端末をCentralとして扱う場合は Bluetoothの設定 と 位置情報サービスの設定 をONにしておく必要があります。
これらがOFFになっている場合、iBeaconの機能を利用することができないため、アプリ開発時にアラートを表示してユーザに知らせることを考えるかと思います。
さらに、できれば設定画面に飛ばしたいと思いますよね?
位置情報サービス の場合は、iOS8であれば設定画面へのURLスキームが復活したため、問題ありません。(iOS7.xでは設定画面への遷移は諦めましょう。)
Bluetooth の場合は CoreBluetooth.framework を利用していれば、難しくありません。(処理に CoreBluetooth.framework が不要なCentral側であっても設定画面に飛ばしたいのであれば、import
する必要があります。)
※ 具体的にはCBPeripheralManager
もしくはCBCentralManager
の初期化時にoption
にCBPeripheralManagerOptionShowPowerAlertKey
もしくはCBCentralManagerOptionShowPowerAlertKey
を設定すれば良いです。
以上がまとめとなります。
ぜひぜひ参考にして頂ければと思います。
本日はここまで。