Я пытаюсь создать пример приложения для 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 {}