Umi Uyuraのブログ

プログラミング関連の作業ログ

TitaniumのiBeaconモジュール検証アプリ作成中

前回調べた情報をもとに、とりあえずiOS/AndroidでiBeaconを検出するところまでできたので、途中経過のまとめ。

umi-uyura.hatenablog.com

進捗

現時点のアプリのソースは umi-uyura/TiBeaconExam にあります。

できること

iOS/Androidともに基本的な機能は同じです。

メインの操作は、iOSは右上のActionアイコンで表示するAction Sheet、AndroidはActionBarに表示するメニューから行います。

f:id:umi-uyura:20160420214734p:plain f:id:umi-uyura:20160420214744p:plain

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といった測定値を整理して表示しています。

f:id:umi-uyura:20160420214803p:plain f:id:umi-uyura:20160420214817p:plain

Eventsタブ

Eventsタブには、測定に関連するイベント(enteredRegionexitedRegiondeterminedRegionStatebeaconRangesbeaconProximity )のログを表示します。

こちらは、イベントの発生パターンや取得できるデータの違いなどを検証するために、各イベントから取得できた情報をそのままダンプする形にしています。

上部にある検索窓にイベント名を入力することで、絞り込むことができます。

f:id:umi-uyura:20160420214831p:plain f:id:umi-uyura:20160420214840p:plain

設定画面

設定画面では、測定対象とするiBeaconのUUID/Major(オプション)/Minor(オプション)を登録できます。設定内容は画面を閉じると保存します。

f:id:umi-uyura:20160420214853p:plain f:id:umi-uyura:20160420214901p:plain

現状の制限

現状は、アプリがフロントにいる間だけiBeaconの検出をします。

iBeaconモジュールラッパーを作った

前回、iOS用とAndroid用のそれぞれのiBeaconモジュールのAPIを比較して、主要なものはほぼ同じものがあるようだったので、ひとまずモジュールの呼び出しを共通化するために、ラッパーを作りました。

app/lib/tibeaconwrapper.js

単純にプラットフォームに合わせたモジュールを呼び出して、存在しない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.CalendarTi.ContactsTi.Media などの権限の取得方法に関してのコードがあります。

iOS/AndroidのiBeacon関連イベントの違い

先に書いたように、現状はアプリ起動状態でのみiBeaconの検出ができます。

で、実際に動かしてみたところ、iOSAndroidでイベントの発生パターンに違いがあることがわかりました。この辺りは、特にAndroid側のモジュールの使い方なども関係しているかもしれないので、もう少し検証が必要な感じです。

今後の課題

次のステップとしては、アプリがバックグラウンドの状態でもiBeaconの検出ができるようにしたいと思います。

iOSAndroidも、バックグラウンドで検知できるようにするにはサービスを作らないといけないのかも、というあたりがわかっていないので、まだまだ検証が必要そう。