LoginSignup
48
48

More than 5 years have passed since last update.

iBeacon で忍者が密会する

Posted at

先日、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 デバイス同士でビーコンの発信・受信を行うようにしました。

  • ビーコンの発信と受信を同時に行う
    • CLLocationManagerCBPeripheralManager を両方動かす
  • 2台のデバイスそれぞれがお互いのビーコンを受信する

Ninja Tryst の概要

さて、アプリの紹介ですが、一言でいえば、待ち合わせを手助けするアプリです。ビーコンによって、相手までのおおまかな距離をアプリ画面に表示します。

という書き方をすると真面目なアプリのようですが、ビーコンで忍者が密会するアプリです。ぶっちゃけ、アホアプリの部類に入ります(注:「アホアプリ」という言葉は褒め言葉です)。

まあ、はっきり言って、ちゃんと使おうとすると不便なアプリです。

詳しくは、公式 Web サイトがオススメです。また、開発メンバの紹介記事も見ていただくのがいいかと思います。

距離の表示

距離は次の4段階で表示しています。

  • 隠:ビーコン未検知
  • 忍:ビーコンの proximity の値が Far
  • 獲:ビーコンの proximity の値が Near
  • 顕:ビーコンの proximity の値が Immediate

実際に動かしてみて

ビーコンから取得できる距離情報に注目したわけですが、期待していたほど距離の精度はよくないという印象を受けました。

ビーコンの accuracy プロパティが距離の数値っぽいと思いきや、この数値から正確な距離を知ることは無理でした(そもそも、Apple のドキュメントにそういう目的には使うなと書いてあります)。ビーコンの proximity プロパティがおおまかな距離を示す値ですが、これもわりとブレがあります。また、移動中に値が更新されるのが思ったよりも遅い気がしました。

また、ビーコンからは方向の情報は得られません(BLE だから当たり前といえば当たり前)。下手な使い方では、位置推定に使うのはつらい感じです。

と、欠点ばかりずらずら書きました。それでも、使えない技術だと思っているわけではありません。大事なことは、何ができるのかを把握してうまく使うことです。

iBeacon の特性をつかんで上手に生かすような使い方を考えれば、有益な技術であることは間違いないと思います。

48
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
48