重新启动蓝牙时没有触发 didDetermineStateForRegion

Posted

技术标签:

【中文标题】重新启动蓝牙时没有触发 didDetermineStateForRegion【英文标题】:didDetermineStateForRegion not fired when restarting bluetooth 【发布时间】: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://***.com/a/25211343/4197536

当我在关闭蓝牙的情况下启动我的应用程序然后将其打开时 -> 它 按预期工作。 当我在打开蓝牙的情况下启动我的应用程序,然后我将其关闭再打开 再次 --> 无法读取未定义的属性“订阅”(即 我订阅了 didDetermineStateForRegion())

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

【问题讨论】:

【参考方案1】:

问题描述了这个顺序:

stopMonitoringForRegion 打开设备蓝牙 didDetermineStateForRegion 未触发

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

【讨论】:

以上是关于重新启动蓝牙时没有触发 didDetermineStateForRegion的主要内容,如果未能解决你的问题,请参考以下文章

循环启动和停止时蓝牙 LE 广告失败

Mac电脑蓝牙不可用怎么办

当蓝牙连接状态发生变化时,防止onDestroy

sh 在Mac OS X上重新启动蓝牙守护程序而不重新启动

sh 在Mac OS X上重新启动蓝牙守护程序而不重新启动

如何重新启动/释放 rfcomm 以进行蓝牙通信?