【发布时间】:2020-05-28 13:56:00
【问题描述】:
我正在尝试修复一个错误,当我在 Android 设备上运行我的应用程序 (ionic 4) 并监控信标区域时,我关闭了设备蓝牙,然后再次打开它。
这个过程:
- 在打开蓝牙的情况下运行我的应用
- startMonitoringForRegion
- didDetermineStateForRegion --> 有效
- 关闭设备蓝牙
- stopMonitoringForRegion
- 打开设备蓝牙
- didDetermineStateForRegion 未触发
重要 --> setTimeout 的丑陋解决方案 --> 解决问题 --> Here 使用此解决方法的堆栈溢出。
--------- 这里是我的信标对象
this.beaconsFromJson = [
{
identifier: 'Mini S/N 018727',
uuid: 'my-beacon-uuid',
major: 1,
minor: 18727,
notifyEntryStateOnDisplay: false
},
{
identifier: 'Mini S/N 018730',
uuid: 'my-beacon-uuid',
major: 1,
minor: 18730,
notifyEntryStateOnDisplay: false
}
];
--------- 这里是我的扫描功能
scan() {
_.forEach( this.beaconsFromJson, beacon => {
const beaconRegion = this.ibeacon.BeaconRegion(
beacon.identifier,
beacon.uuid,
beacon.major,
beacon.minor,
beacon.notifyEntryStateOnDisplay
)
this.ibeacon.startMonitoringForRegion(beaconRegion).then(
() => console.log('Start monitoring' + beaconRegion.identifier),
(error) =>
console.error('Native layer failed to begin monitoring: ', error)
);
}) // end foreach
setTimeout( () => {
this.delegate.didDetermineStateForRegion().subscribe((data: IBeaconPluginResult) => {
switch (data.state) {
case 'CLRegionStateInside':
this.beacons.push(data.region);
this.loadingService.loading$.next({status: false});
break;
case 'CLRegionStateOutside':
this.loadingService.loading$.next({status: false});
this.beacons = this.beacons.filter(beacon => beacon.identifier !== data.region.identifier);
break;
default:
break;
}
})
}, 1); // Ugly but it works --> https://stackoverflow.com/a/25211343/4197536
}
- 当我在关闭蓝牙的情况下启动我的应用程序然后将其打开时 -> 它 按预期工作。
- 当我在打开蓝牙的情况下启动我的应用程序,然后我将其关闭再打开 再次 --> 无法读取未定义的属性“订阅”(即 我订阅了 didDetermineStateForRegion())
注意:这个脚本有效,但我正在寻找更好的解决方案!
【问题讨论】:
标签: bluetooth-lowenergy cordova-plugins ionic4 ibeacon android-ibeacon