###前提・実現したいこと
Monacaでビーコンを使ったアプリを作っています。
https://docs.monaca.io/ja/sampleapp/samples/ibeacon/
↑こちらのテンプレートで開発しています。
###発生している問題・エラーメッセージ
上のテンプレートだと、同じUUID(minor値が異なる)のビーコンに
対応できません。mapに同じキーを設定できないので。
エラーメッセージ
###該当のソースコード
JavaScript
###試したこと
キーには01,02と固有の値を振り
UUIDをnumberやidの項目で使えないかと試行錯誤しましたが
どうもうまくいきません。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
検証環境持ってないため、ソースコードを眺めての判断ですが、テンプレートのソースいじれば同一uuidでminor違いに対応できそうですが。
サービスにthis.currentMinor = nullの行を追加。
js
1// 修正前 2app.service('iBeaconService', function() { 3 this.currentBeaconUuid = null; 4 5// 修正後 6app.service('iBeaconService', function() { 7 this.currentBeaconUuid = null; 8 this.currentMinor = null;
サービス内で定義されているbeacons連想配列をminorをキーとした2段連想配列に修正。
js
1// 修正前 2var beacons = { 3 "00000000-EA98-1001-B000-001C4D9C64FA": {icon: 'img/1.jpg', rssi: -63, proximity: PROX_UNKNOWN, name: 'JIBBER', number: '1', id: '000265C9', major: 1, minor: 1}, 4 "F5A10AF9-A670-4F54-B491-8607393F0DDC": {icon: 'img/2.jpg', rssi: -63, proximity: PROX_UNKNOWN, name: 'BUONO', number: '2', id: '0002D08D', major: 1, minor: 1}, 5 // 以下略 6}; 7 8// 修正後 9var beacons = { 10 "00000000-EA98-1001-B000-001C4D9C64FA": { 11 1: { icon: 'img/1.jpg', rssi: -63, proximity: PROX_UNKNOWN, name: 'JIBBER-1', number: '1', id: '000265C9', major: 1, minor: 1 }, 12 2: { icon: 'img/1.jpg', rssi: -63, proximity: PROX_UNKNOWN, name: 'JIBBER-2', number: '1', id: '000265C9', major: 1, minor: 2 } 13 }, 14 "F5A10AF9-A670-4F54-B491-8607393F0DDC": { 15 1: { icon: 'img/2.jpg', rssi: -63, proximity: PROX_UNKNOWN, name: 'BUONO', number: '2', id: '0002D08D', major: 1, minor: 1 } 16 } 17};
サービス内のthis.watchBeacons関数内のdelegate.didRangeBeaconsInRegion関数でcallback関数を呼び出すときにminorも渡すように修正
js
1// 修正前 2delegate.didRangeBeaconsInRegion = function (pluginResult) { 3 var beaconData = pluginResult.beacons[0]; 4 var uuid = pluginResult.region.uuid.toUpperCase(); 5 if (!beaconData || !uuid) { 6 return; 7 } 8 9 callback(beaconData, uuid); 10 console.log('[DOM] didRangeBeaconsInRegion: ' + JSON.stringify(pluginResult)); 11}; 12 13// 修正後 14delegate.didRangeBeaconsInRegion = function (pluginResult) { 15 var beaconData = pluginResult.beacons[0]; 16 var uuid = pluginResult.region.uuid.toUpperCase(); 17 var minor = pluginResult.region.minor; 18 if (!beaconData || !uuid) { 19 return; 20 } 21 22 callback(beaconData, uuid, minor); 23 console.log('[DOM] didRangeBeaconsInRegion: ' + JSON.stringify(pluginResult)); 24};
app.controller('InfoPageCtrl'~ないでminorを扱うように修正
js
1// 修正前 2app.controller('InfoPageCtrl', ['$scope', 'iBeaconService', function ($scope, iBeaconService) { 3 $scope.beacon = iBeaconService.beacons[iBeaconService.currentBeaconUuid][iBeaconService.currentBeaconMinor]; 4 $scope.beaconUuid = iBeaconService.currentBeaconUuid; 5}]); 6 7// 修正後 8app.controller('InfoPageCtrl', ['$scope', 'iBeaconService', function ($scope, iBeaconService) { 9 $scope.beacon = iBeaconService.beacons[iBeaconService.currentBeaconUuid][iBeaconService.currentBeaconMinor]; 10 $scope.beaconUuid = iBeaconService.currentBeaconUuid; 11 $scope.beaconMinor = iBeaconService.currentBeaconMinor; 12}]);
app.controller('TopPageCtrl'~内のcallback関数定義のところで、引数にminorを追加
js
1// 修正前 2var callback = function (deviceData, uuid) { 3 4// 修正後 5var callback = function (deviceData, uuid, minor) {
同じくcallback関数定義内で$scope.enterInfoPage関数呼び出し時の引数にminor追加
js
1// 修正前 2if (iBeaconService.currentBeaconUuid === null && beacon.rssi > -45) { 3 $scope.enterInfoPage(uuid); 4} 5 6// 修正後 7if (iBeaconService.currentBeaconUuid === null && beacon.rssi > -45) { 8 $scope.enterInfoPage(uuid, minor); 9}
$scope.enterInfoPage関数内でminorも扱うように修正
js
1// 修正前 2$scope.enterInfoPage = function(currentUuid) { 3 iBeaconService.currentBeaconUuid = currentUuid; 4 $scope.ons.navigator.pushPage('info-page.html'); 5 $scope.ons.navigator.on("prepop", function() { 6 iBeaconService.currentBeaconUuid = null; 7 }); 8}; 9 10// 修正後 11$scope.enterInfoPage = function (currentUuid, currentMinor) { 12 iBeaconService.currentBeaconUuid = currentUuid; 13 iBeaconService.currentBeaConMinor = currentMinor; 14 $scope.ons.navigator.pushPage('info-page.html'); 15 $scope.ons.navigator.on("prepop", function () { 16 iBeaconService.currentBeaconUuid = null; 17 iBeaconService.currentBeaconMinor = null; 18 }); 19};
JSがわの修正箇所これくらいで後はHTML側はinfo-page.htmlでminorも表示するように修正
html
1<!-- 修正前 --> 2<p style="text-decoration: underline;">UUID</p> 3{{beaconUuid}} 4 5<!-- 修正後 --> 6<p style="text-decoration: underline;">UUID/Minor</p> 7{{beaconUuid}}/{{beaconMinor}}
以上の修正で、minorにも対応したものとなると思います。
投稿2017/02/13 12:36
総合スコア4267
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/14 02:27
2017/02/14 02:30 編集
2017/02/14 04:52
2017/02/14 04:56