その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

iBeaconの実装に役立つ記事の逆引きリファレンス

iBeacon関連のAPIはそんなに多くなく複雑でもないので、実装の参考になる日本語記事はわりと出そろっている *1、という印象を個人的には持っています *2


というわけで、 こういうことをやりたいときはここを見ろ! という逆引きリファレンス的な切り口で 実装に役立つ日本語記事 を紹介していきたいと思います。


iBeaconに興味あるけど何から始めていいかわからない場合にはこの順番に見るといいよ、というオススメの順番にもなっています。

コードなしでとりあえず試してみる

AppStoreで普通にダウンロードできるアプリを使って、まずはiBeaconを体験してみましょう という記事。


アプリはEstimote製ですが、EstimoteのBeaconsを持っている必要はなく、iPhoneもしくはiPad2台を使って試せます。

自分で実装して動かしてみる

まずはこの記事のとおりに一通り実装して、

こちらの記事を参考に修正すると、2台のiPhoneを使用して、一方をビーコン(Peripheral)、もう一方を監視側(Central)として iBeacon の挙動を試すことができます。


ちなみにこのとおりに実装したものが、iOS7の新機能のサンプルコードを約20種詰め込んだオープンソースアプリ、 iOS7 Samplerに入っています。

バックグラウンドで動くようにする

Background ModesのLocation Updatesにチェックを入れましょう。

バックグラウンドにおける挙動の詳細な解説あり。

Estimote Beacons

Estimote SDKを使用せずBeaconsを検出する

どこかの誰かがどうにかして見つけたEstimoteのUUIDがのってるので、これを使うとEstimote SDKなしでBeaconsを検出できます。実際やってみるとあっさりうまくいきました。


現状Estimote SDKは単なる1:1のラッパーなので、このUUID使って標準SDKだけで実装するのは汎用的でいいかと思います。もちろん、今後Beaconsに既についている加速度センサや温度センサの情報にもアクセスできるようになるので、Estimote専用につくっていくのもありです。


位置推定

「フィンガープリンティング」という手法で、RSSIから位置(二次元座標)を推定する話。

その他実装情報

Appleのドキュメントに書かれていたiBeacon関連の有用な情報のまとめ。

とくにcocos2d向けに特殊な実装が必要なわけでもなさそうです。

(おまけ)実際に動かしてみての精度/挙動に関する言及

逆引きリファレンスというコンセプトからは外れますが、実装してみた方による挙動や精度に関する言及も集めてみました。

  • didExitRegion: メソッドについては、領域の外へ出てから約 35 秒程のタイムラグの後に呼び出されてしまいます。もちろんここで出している 35 秒という値は、あくまでも実験結果の値ですので、環境によっては全く別な結果になる可能性もあります。おそらく、境界部分をすぐに行ったり来たりした時に、毎回 didExitRegion: と didEnterRegion: を交互に呼ぶ必要もないという事を考えての仕様なのではないかと思います。
  • proximity が Unknown になった場所で 40 秒程待った時に、didExitRegion: は呼ばれるのかということを行いました。その結果 didExitRegion: が呼ばれることはありませんでした。これも実測値でしか無いのですが、出入りを監視する範囲と、proximity が Far から Unknown になる範囲はずれているのでは無いでしょうか。

NFCとかと比べると近距離での感度が悪い。特にproximityの値を判定した場合に、めちゃくちゃ近い距離なのに、3秒後ぐらいにやっとImmediateと判定されるレベル。これがiBeaconの仕様なのか、iOS7のCoreLocationAPIの制約なのか、EstimoteBeaconのハードのせいなのか不明。


*1:ちゃんとAPIリファレンスと付き合わせて確認したわけではありませんが。。

*2:なのでQiitaのアドベントカレンダーでは、斜め下に逃げるかたちでこんな記事を書きました。