bluetooth-lowenergy - 重新启动蓝牙时没有触发 didDetermineStateForRegion
问题描述
我正在尝试修复在 Android 设备上运行我的应用程序(ionic 4)并监视信标区域时发生的错误,我关闭设备蓝牙然后再次打开它。
这个过程:
- 打开蓝牙运行我的应用程序
- startMonitoringForRegion
- didDetermineStateForRegion --> 有效
- 关闭设备蓝牙
- stopMonitoringForRegion
- 打开设备蓝牙
- didDetermineStateForRegion 没有被解雇
重要--> 使用setTimeout的丑陋解决方案-->解决问题 -->这里有一个带有此解决方法的 stackoverflow。
---------- 这里是我的信标对象
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() 进行的订阅)
注意:这个脚本有效,但我正在寻找更好的解决方案!
解决方案
问题描述了这个序列:
- stopMonitoringForRegion
- 打开设备蓝牙
- didDetermineStateForRegion 没有被解雇
最后一个要点是预期的,因为在第一个要点中停止了监控。为了获得didDetermineStateForRegion
回调,必须启动监控。
推荐阅读
- docker - 我无法在 Linux mint 中启动我的 docker
- c - 函数,它返回指向 C 中指向 int 的指针的指针
- mongodb - MongoDB对分页结果应用排序
- java - 在java中返回相同的公共IP地址
- jsf - Websphere:java.lang.IllegalStateException:没有为此应用程序配置工厂
- php - PHP中变量之间的换行符
- apache-spark - 如何在pyspark数据框中读取scylladb表
- c# - 从数据库加载时出错。用户未与受信任的 SQL Server 连接关联
- c# - 在“Web API 重定向 (URI)”中获取查询字符串参数
- c++ - 如何以编程方式从 PKCS7 中提取 CA、多个 CA 和公共证书/密钥?