首页 > 解决方案 > 重新启动蓝牙时没有触发 didDetermineStateForRegion

问题描述

我正在尝试修复在 Android 设备上运行我的应用程序(ionic 4)并监视信标区域时发生的错误,我关闭设备蓝牙然后再次打开它。

这个过程:

重要--> 使用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
}

注意:这个脚本有效,但我正在寻找更好的解决方案!

标签: bluetooth-lowenergycordova-pluginsionic4ibeaconandroid-ibeacon

解决方案


问题描述了这个序列:

  • stopMonitoringForRegion
  • 打开设备蓝牙
  • didDetermineStateForRegion 没有被解雇

最后一个要点是预期的,因为在第一个要点中停止了监控。为了获得didDetermineStateForRegion回调,必须启动监控。


推荐阅读