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
Estimote SDKを使用せずBeaconsを検出する
どこかの誰かがどうにかして見つけたEstimoteのUUIDがのってるので、これを使うとEstimote SDKなしでBeaconsを検出できます。実際やってみるとあっさりうまくいきました。
現状Estimote SDKは単なる1:1のラッパーなので、このUUID使って標準SDKだけで実装するのは汎用的でいいかと思います。もちろん、今後Beaconsに既についている加速度センサや温度センサの情報にもアクセスできるようになるので、Estimote専用につくっていくのもありです。
EstimoteのBeaconsの加速度センサと温度センサにアクセスできるAPIはいつSDKに追加されるの?と公式アカウントに聞いたところ、2013末か2014初頭とのこと。 http://t.co/Dqqb6Pp9PH
— Tsutsumi Shuichi (@shu223) 2013, 12月 10
MacとiBeacon
Macアプリのつくりはじめからの解説があります。
- Tech Tech walker: 【iBeacon】部屋に帰ると「おかえり」って言ってくれるiPhoneアプリを作る【iMac→iPhone】
- MacをiBeaconにする ステータスバー常駐アプリXBeaconを作ってみた - ReDo
AndroidとiBeacon
- iOS - AndroidでiBeacon信号を受信してみよう - Qiita [キータ]
- あみゅーの奮闘記 AndroidでiBeaconを受信する!
- あみゅーの奮闘記 iBeacon Android 繋ぎたい!
その他実装情報
とくにcocos2d向けに特殊な実装が必要なわけでもなさそうです。
(おまけ)実際に動かしてみての精度/挙動に関する言及
逆引きリファレンスというコンセプトからは外れますが、実装してみた方による挙動や精度に関する言及も集めてみました。
- didExitRegion: メソッドについては、領域の外へ出てから約 35 秒程のタイムラグの後に呼び出されてしまいます。もちろんここで出している 35 秒という値は、あくまでも実験結果の値ですので、環境によっては全く別な結果になる可能性もあります。おそらく、境界部分をすぐに行ったり来たりした時に、毎回 didExitRegion: と didEnterRegion: を交互に呼ぶ必要もないという事を考えての仕様なのではないかと思います。
- proximity が Unknown になった場所で 40 秒程待った時に、didExitRegion: は呼ばれるのかということを行いました。その結果 didExitRegion: が呼ばれることはありませんでした。これも実測値でしか無いのですが、出入りを監視する範囲と、proximity が Far から Unknown になる範囲はずれているのでは無いでしょうか。
NFCとかと比べると近距離での感度が悪い。特にproximityの値を判定した場合に、めちゃくちゃ近い距離なのに、3秒後ぐらいにやっとImmediateと判定されるレベル。これがiBeaconの仕様なのか、iOS7のCoreLocationAPIの制約なのか、EstimoteBeaconのハードのせいなのか不明。