didDetermineStateForRegion 和 didExitRegion 返回错误响应

didDetermineStateForRegion and didExitRegion returning false responses

当用户进入信标区域和离开信标区域时,我会向用户显示本地通知。出口是最重要的,因为我告诉用户他们在该位置居住了多长时间。我正在使用区域监控,因为即使应用程序处于后台或暂停状态,它也能让我跟踪信标。我遇到了一个错误,我正在监视 3 个信标(这发生在 2 和 1 上,但频率较低)。我的 phone 会睡觉,我会继续监视信标。然后,我的应用程序将由于其中一个信标的 didExitRegion 而唤醒,即使所有 3 个信标都与我的 phone 面朝上坐在同一张桌子上。每次都是不同的信标,所以我已经确定了我们的信号强度。然后,一旦应用程序被唤醒,它就会重新发现信标并立即重新进入(因为它一开始就没有离开过信号)。我同时用 android 设备检测信号,并且信标一直在广播,所以 iPhone 不应该丢失这些信号,尤其是没有足够长的时间来考虑这是一个出口。

我试图通过使用

来解决这个问题
[self.locationManager requestStateForRegion:region];

但是,在这些情况下,这将 return 状态 2,即 CLRegionStateOutside。

我该如何解决这个问题?有没有人有过类似的经历。我应该能够在信标区域停留 1 分钟或 1 小时,只有在信标未被发现 30 秒后才能离开。

需要检查的几件事:

  • 验证多个 iOS 设备是否会发生这种情况。 iOS 设备可能存在硬件问题,导致低功耗蓝牙接收信号较弱,或者接收到更多无线电噪音。我自己从未见过这个,但我听说其他人坚持在某些 iOS 设备上看到过它。

  • 检查 iOS 设备和 Android 设备接收到的信号电平,方法是使用 Locate for iOS and Android 等应用程序对信标进行测距。两个设备上的信号电平应该相似。强信号的 RSSI 约为 -60 或更小。弱信号的 RSSI 约为 -100 或更负。如果信号较弱,可能会导致间歇性检测丢失,因为无线电噪声有时会阻止数据包被正确接收。如果您可以配置信标以增加其发射器功率级别,请这样做。

  • 使用前台的“定位”应用程序,调整信标的范围以检查信号强度并以不同角度旋转信标。一些信标的天线方向图在一侧弱得多。您可能会发现方向给出的信号要弱得多,同样,弱信号会导致丢失。

  • 检查信标的规格或配置设置,了解信标传输的频率。配置为很少传输以节省电池电量的信标(例如每 5 秒一次)更有可能导致这种情况,因为它只需要连续丢失 6 个数据包(很少见但可能)导致区域退出。

另一种可能性是,您附近的蓝牙频率范围内周期性地存在异常数量的无线电噪声。这不太可能,但我以前见过。我住在 U.S 街对面。带有强大天线的海洋安装,在家里我经常收到比在办公室更高的数据包 CRC 错误率。