先日、iBeacon を使ったアプリを AppStore で公開しましたので、簡単に紹介させていただきたいと思います。このアプリは複数名で開発しており、私は実装担当でした。
iBeacon の特徴
iBeacon は、ざっくり言えば、様々な機器が発するビーコン信号を iOS デバイスが検出する仕組みです。
iBeacon の特徴を簡単に述べておきます。詳しい情報は、昨日や一昨日の Advent Calendar の記事が参考になると思います。
- BLE (Bluetooth Low Energy) を利用
- 一般の BLE 通信と異なり、ペアリングが不要
- 受信側デバイス
- BLE 搭載の iOS デバイス
- 発信側デバイス
- BLE 搭載の機器で、iBeacon 仕様のビーコン発信を実装したもの
- アプリがバックグラウンドのときでも、ビーコンを検出してユーザに通知できる
- おおまかな距離の情報が取得できる
Ninja Tryst では
今回のアプリ開発ではこれらの特徴の中から、距離の情報が取得できる、という点に着目してみました。
iBeacon の実装
次に、iBeacon をアプリに組み込む実装方法を簡単に述べておきます。これも、詳しい情報は、昨日や一昨日の Advent Calendar の記事が参考になると思います。
また個人的には、WWDC のサンプルコードである AirLocate のコードを参考資料として読みました。iOS Dev Center でダウンロードできます。
ビーコンの受信
BLE を利用していますが、Core Bluetooth を使うわけではありません。iBeacon は、Region Monitoring に近い性格のものとして位置づけられているように思えます。
- Core Location フレームワークを使う
- 従来は、位置情報取得や Region Monitoring の機能があった
- ここに iBeacon 受信機能が追加された
-
CLLocationManager
- ビーコン領域の検出
-
startMonitoringForRegion:
で開始 - ビーコン領域に入ったり出たりすると
locationManager:didDetermineState:forRegion:
が呼ばれる
-
- 個々のビーコン信号を取得
-
startRangingBeaconsInRegion:
で開始 - ビーコン信号を取得すると
locationManager:didRangeBeacons:inRegion:
が呼ばれる
-
- ビーコン領域の検出
ビーコンの発信
iOS デバイスは主にビーコンの受信側として使われることが多いと思いますが、ビーコンの発信側になることもできます。こちらは、BLE 周辺機器として実装します。
- Core Bluetooth フレームワークを使う
-
CBPeripheralManager
- ビーコン発信
-
startAdvertising:
で発信 - 発信するデータは
CLBeaconRegion
で生成する(peripheralDataWithMeasuredPower:
を使う)
-
- ビーコン発信
Ninja Tryst では
iBeacon は一般的には、ビーコン発信器を特定の場所に固定で設置して、iOS デバイスがビーコン受信器になる、という使い方です。
しかし今回のアプリ開発では、iOS デバイスが発信側にもなれる、という点に着目して、iOS デバイス同士でビーコンの発信・受信を行うようにしました。
- ビーコンの発信と受信を同時に行う
-
CLLocationManager
とCBPeripheralManager
を両方動かす
-
- 2台のデバイスそれぞれがお互いのビーコンを受信する
Ninja Tryst の概要
さて、アプリの紹介ですが、一言でいえば、待ち合わせを手助けするアプリです。ビーコンによって、相手までのおおまかな距離をアプリ画面に表示します。
という書き方をすると真面目なアプリのようですが、ビーコンで忍者が密会するアプリです。ぶっちゃけ、アホアプリの部類に入ります(注:「アホアプリ」という言葉は褒め言葉です)。
まあ、はっきり言って、ちゃんと使おうとすると不便なアプリです。
詳しくは、公式 Web サイトがオススメです。また、開発メンバの紹介記事も見ていただくのがいいかと思います。
- Ninja Tryst : 公式 Web サイト
- iBeacon実験アプリ NinjaTryst リリースしました。 : たいへんインパクトが強いデザインを作ったデザイナー
- クソアプリカンパニーの地獄部屋 — Ninja Trystの開発に参加してました : そもそもこの人がいなかったらこのアプリはなかった、リーダー&企画
距離の表示
距離は次の4段階で表示しています。
- 隠:ビーコン未検知
- 忍:ビーコンの proximity の値が Far
- 獲:ビーコンの proximity の値が Near
- 顕:ビーコンの proximity の値が Immediate
実際に動かしてみて
ビーコンから取得できる距離情報に注目したわけですが、期待していたほど距離の精度はよくないという印象を受けました。
ビーコンの accuracy プロパティが距離の数値っぽいと思いきや、この数値から正確な距離を知ることは無理でした(そもそも、Apple のドキュメントにそういう目的には使うなと書いてあります)。ビーコンの proximity プロパティがおおまかな距離を示す値ですが、これもわりとブレがあります。また、移動中に値が更新されるのが思ったよりも遅い気がしました。
また、ビーコンからは方向の情報は得られません(BLE だから当たり前といえば当たり前)。下手な使い方では、位置推定に使うのはつらい感じです。
と、欠点ばかりずらずら書きました。それでも、使えない技術だと思っているわけではありません。大事なことは、何ができるのかを把握してうまく使うことです。
iBeacon の特性をつかんで上手に生かすような使い方を考えれば、有益な技術であることは間違いないと思います。