Невозможно подобрать ближайшие маяки при создании приложения Ionic Cordova - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать пример приложения для IonCordova для iOS, которое сканирует ближайшие маяки и распечатывает их (со связанными данными) в пользовательском интерфейсе. Значения должны меняться в зависимости от близости.

Я следовал приведенному ниже примеру (но использовал публикацию / подписку на события):

https://ionicframework.com/docs/native/ibeacon/

Моя проблема заключается в том, что после подписки на события didStartMonitoringForRegion результирующий BeaconList возвращает «undefined не является объектом». Я не могу подобрать близлежащие маяки. Я подтвердил, что они существуют, используя ' Core Beacons '. Двадцать из них.

Я устанавливаю UUID моего телефона ниже - я получаю его от this.device.uuid:

BeaconRegion ('deskBeacon', 'A2E19874-3A63-4574-84B8-4720D0934099');

Должен ли я явно указывать близлежащие UUID маяковых радиосигналов, которые я сканирую (кажется неправильным)?

Не уверен, почему я не собираю соседние маяки. Советы приветствуются.

XCode 10.1 Ionic v3 Кордова 6.1.0

HOME.TS

    import { Component } from '@angular/core';
    import { NavController, Platform, Events } from 'ionic-angular';
    import { NgZone } from '@angular/core';

    // plugins

    import { BeaconProvider } from '../../providers/beacon-provider'
    import { BeaconModel } from '../../models/beacon-model';

    @Component({
      selector: 'page-home',
      templateUrl: 'home.html'
    })
    export class HomePage {

      beacons: BeaconModel[] = [];
      zone: any;


      constructor(public navCtrl: NavController, public platform: Platform,
        public beaconProvider: BeaconProvider, public events: Events) 
        {
            // required for UI update
          this.zone = new NgZone({ enableLongStackTrace: false });

        }

        ionViewDidLoad() {
          this.platform.ready().then(() => {
            this.beaconProvider.initialise()
            .then((isInitialised) => {
              if (isInitialised) {
                this.startScanningForBeaconEvents();
              }
            }).catch(err => {
              console.log(err);
              console.log(err.errors);
            });
          });
        }

        startScanningForBeaconEvents() {
          this.events.subscribe('didStartMonitoringForRegion', (data) => {
            // update the UI with the beacon list  
            this.zone.run(() => {
              this.beacons = [];
              let beaconList = data.beacons;

              beaconList.forEach((beacon) => {
                let beaconObject = new BeaconModel(beacon);
                this.beacons.push(beaconObject);
                console.log("nearby beacon " + beaconObject.uuid + " has been added");
              });
            });
        });

      }
    }

BEACONPROVIDER.TS

import { Injectable } from '@angular/core';
import { Platform, Events } from 'ionic-angular';
import { IBeacon } from '@ionic-native/ibeacon'
import { Device } from '@ionic-native/device'; 

@Injectable()
export class BeaconProvider {

  delegate: any;
  beaconRegion: any;
  uuid: any;
  isAdvertisingAvailable: boolean = null;

  constructor(private platform: Platform, private device: Device, 
    private ibeacon: IBeacon, public events: Events) {
      this.ibeacon = ibeacon;
      this.device = device;
      this.events = events;
      this.platform = platform;
      this.enableDebugLogs();
  }

  public enableDebugLogs(): void {
    this.platform.ready().then(async () => {
      this.ibeacon.enableDebugLogs();
      this.ibeacon.enableDebugNotifications();
    });
  }

  initialise(): any {

    this.uuid = this.device.uuid;

    let promise = new Promise((resolve, reject) => {
      // we need to be running on a device 
      if (this.platform.is('cordova')) {
        // Request permission to use location on iOS
        this.ibeacon.requestAlwaysAuthorization();
        // create a new delegate and register it with the native layer
        this.delegate = this.ibeacon.Delegate();
        // Subscribe to some of the delegate's event handlers
        this.delegate.didRangeBeaconsInRegion()
          .subscribe(
            data => {
              this.events.publish('didRangeBeaconsInRegion', data);
            },
              error => console.error()
            );
        this.delegate.didStartMonitoringForRegion()
        .subscribe(
          data => {
            this.events.publish('deskBeacon', data);
          },
          error => console.error()
          );
        this.delegate.didEnterRegion()
        .subscribe(
          data => {
            this.events.publish('didEnterRegion', data);
          },
          error => console.error()
          );
        this.delegate.didExitRegion().subscribe(
          data => {
            this.events.publish('didExitRegion', data);
          },
          error => console.error()
          );
        // setup a beacon region
        this.beaconRegion = this.ibeacon.BeaconRegion('deskBeacon', 'A2E19874-3A63-4574-84B8-4720D0934099');

        this.ibeacon.startMonitoringForRegion(this.beaconRegion)
          .then(() => {
            resolve(true);
          }).catch(error => {
            resolve(false);
          });
      } else {
        resolve(false);
      }
    });

    return promise;
  }

}

APP.MODULE.TS

import { BeaconProvider } from '../providers/beacon-provider'
import { BrowserModule } from '@angular/platform-browser';
import { IBeacon } from '@ionic-native/ibeacon'
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { Device } from '@ionic-native/device';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';

@NgModule({
  declarations: [
    MyApp,
    HomePage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage
  ],
  providers: [
    StatusBar,
    SplashScreen,
    IBeacon,
    BeaconProvider,
    Device,
    { provide: ErrorHandler, 
      useClass: IonicErrorHandler}
  ]
})
export class AppModule {}

1 Ответ

0 голосов
/ 09 января 2019

Я не эксперт, использующий этот плагин ionic3 cordova, но я подозреваю, что это неправильный обратный вызов для ваших результатов ранжирования:

this.events.subscribe('didStartMonitoringForRegion', (data) => {

Похоже, что это обратный вызов, указывающий, что ранжирование началось успешно, и если оно истинно, то неудивительно, что data.beacons не определено. Вы, вероятно, хотите получить список маяков из обратного вызова didRangeBeaconsInRegion.

...