TitaniumのiBeaconモジュール検証アプリ作成中
前回調べた情報をもとに、とりあえずiOS/AndroidでiBeaconを検出するところまでできたので、途中経過のまとめ。
進捗
現時点のアプリのソースは umi-uyura/TiBeaconExam にあります。
できること
メインの操作は、iOSは右上のActionアイコンで表示するAction Sheet、AndroidはActionBarに表示するメニューから行います。
Actionは以下のとおり。
Action | 意味 |
---|---|
Start Scan | 周辺のiBeaconの測定を開始する |
Stop Scan | 周辺のiBeaconの測定を停止する |
Clear | Beacon / Events タブのログをクリアする |
Settings(iOSは左上の歯車アイコン) | 設定画面を開く |
※Start ScanとStop Scanは測定状態に応じて切り替わります。
Beaconタブ
Beaconタブには、iBeaconとの距離が測定できたときに発生する beaconProximity
イベントログを表示。
こちらは、検知したiBeaconのMajar、Minor、Proximityといった測定値を整理して表示しています。
Eventsタブ
Eventsタブには、測定に関連するイベント(enteredRegion
、 exitedRegion
、 determinedRegionState
、 beaconRanges
、 beaconProximity
)のログを表示します。
こちらは、イベントの発生パターンや取得できるデータの違いなどを検証するために、各イベントから取得できた情報をそのままダンプする形にしています。
上部にある検索窓にイベント名を入力することで、絞り込むことができます。
設定画面
設定画面では、測定対象とするiBeaconのUUID/Major(オプション)/Minor(オプション)を登録できます。設定内容は画面を閉じると保存します。
現状の制限
現状は、アプリがフロントにいる間だけiBeaconの検出をします。
iBeaconモジュールラッパーを作った
前回、iOS用とAndroid用のそれぞれのiBeaconモジュールのAPIを比較して、主要なものはほぼ同じものがあるようだったので、ひとまずモジュールの呼び出しを共通化するために、ラッパーを作りました。
単純にプラットフォームに合わせたモジュールを呼び出して、存在しないAPIを使うときは警告を出力するようにしているだけです。
... var tibeacon = null; if (!tibeacon) { if (OS_IOS) { tibeacon = require('org.beuckman.tibeacons'); } else if (OS_ANDROID) { tibeacon = require('com.drtech.altbeacon'); } } ... exports.startMonitoringForRegion = function(region) { Ti.API.debug('TiBeaconWrapper.startMonitoringForRegion() - ' + JSON.stringify(region)); tibeacon.startMonitoringForRegion(region); }; exports.stopMonitoringAllRegions = function() { Ti.API.debug('TiBeaconWrapper.stopMonitoringAllRegions()'); tibeacon.stopMonitoringAllRegions(); }; ... exports.checkAvailability = function() { Ti.API.debug('TiBeaconWrapper.checkAvailability()'); if (OS_ANDROID) { return tibeacon.checkAvailability(); } else { warningNotSupport('TiBeaconWrapper.checkAvailability()'); } }; ...
権限関連はTitanium SDK 5.1.0サンプルアプリを参考に
iBeaconを取り扱う場合、iOS/Androidともに位置情報関連の権限を取得する必要があります。
特にAndroidは6.0になって新しい権限設定方法になっていたりするのを考慮したりしなくてはならないわけですが、ここは Titanium SDK 5.1.0のサンプルアプリ が参考になりました。
サンプルアプリの中の app/controllers/permissions.js に、Ti.Geolocation
の他にも、Ti.Calendar
、 Ti.Contacts
、 Ti.Media
などの権限の取得方法に関してのコードがあります。
iOS/AndroidのiBeacon関連イベントの違い
先に書いたように、現状はアプリ起動状態でのみiBeaconの検出ができます。
で、実際に動かしてみたところ、iOSとAndroidでイベントの発生パターンに違いがあることがわかりました。この辺りは、特にAndroid側のモジュールの使い方なども関係しているかもしれないので、もう少し検証が必要な感じです。
今後の課題
次のステップとしては、アプリがバックグラウンドの状態でもiBeaconの検出ができるようにしたいと思います。
iOSもAndroidも、バックグラウンドで検知できるようにするにはサービスを作らないといけないのかも、というあたりがわかっていないので、まだまだ検証が必要そう。
[iBeacon&Eddystone]統計・防災・位置情報がひと目でわかるビーコンアプリの作り方
- 作者: 市川博康,竹田寛郁
- 出版社/メーカー: 技術評論社
- 発売日: 2016/04/13
- メディア: Kindle版
- この商品を含むブログを見る