iBeacon 监控结果不可靠(didEnterRegion 和 didExitRegion)

iBeacon Monitoring with Unreliable Results (didEnterRegion & didExitRegion)

我目前正在开发一个 iOS 应用程序,它可以对 iBeacon 进行范围和监控,以便能够执行某些操作并接收通知。 测距工作完美无缺,但我在信标监控和通知方面遇到了问题。我已经对这个主题进行了大量研究,并且我知道 CoreLocation 框架通常有这样的问题,但我想知道其他开发人员是如何 fixing/approaching 这个的。

基本上,当 didEnterRegion 和 didExitRegion 方法被触发时,我会显示本地通知。不幸的是,这两种方法经常被触发(以一种不可靠的方式),即使 iBeacon 就在它旁边,尽管有时工作得很好,这让它更烦人。 我已经尝试降低 iBeacon 广告间隔,虽然它有所帮助,但并没有完全解决问题。现在,我正在尝试使用逻辑过滤器,如果进入或退出事件发生在最后 X 分钟内,我将忽略触发通知(我正在考虑 5 到 15 之间的 'magic' 数字)。

有人遇到同样的问题吗?在这种情况下添加第二个 iBeacon 会有帮助吗? (也许同时监视它们,并根据这两个输入从逻辑上过滤退出和进入事件?)。 我还考虑添加另一层数据来显示通知,可能基于 GPS 或 Wifi 信息。有人试过吗?

还有其他想法吗?我愿意接受任何建议。

以防万一,我正在使用 Estimote iBeacons 和 iOS9 (Objective-c)。

感谢您的宝贵时间!

信标发出脉冲信号。测距还执行间歇扫描(大约每 100 毫秒)。这意味着您的设备可能会连续几秒钟错过信标,这可能会导致您遇到的结果。您可以使用此方法记录信标 RSSI 值:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)iBeacons inRegion:(CLBeaconRegion *)region

我相信你在看到 didExitRegion 被调用之前会看到很多零值。这不是您的代码或信标的错误。这仅与发出的信号或检测都不是恒定的事实有关。他们在跳动。当信标与您的设备放在同一张桌子上时,这些问题可能会发生,并且当信号被物理对象和人阻挡时,在现实世界中可能会被放大。

我会使用测距来更准确地确定您的信标是否在附近。请注意,测距,尤其是在后台测距会消耗大量电量。

间歇区域 exit/entry 事件是一个常见问题,并且通常 完全使用带有计时器的软件过滤器解决正如你所建议的。您如何设置过滤器的具体细节(在处理退出逻辑之前退出后等待重新进入的最短时间)因每个用例而异,因此最好将其置于您的控制之下。

了解 区域退出是由于 iOS 在 CLBeaconRegion 30 秒内未检测到来自信标的任何蓝牙广告。 如果检测到两个数据包相隔 31 秒,您将获得区域退出,然后在一秒后进入区域。

这通常发生在低信号水平时。如果 iOS 设备位于信标传输范围的外缘,则只会收到一小部分数据包。使用 1Hz 的信标传输,如果连续丢失 30 个数据包,iOS 设备将获得退出事件。

您可以采取多种措施来减少此问题 在您想要可靠覆盖的特定区域:

  1. 将你的信标发射器功率调到最大。这将在您关心的区域提供更强的信号水平和更少的丢失数据包。

  2. 把广告率调到最大。以 10 Hz 进行广告时,接收的数据包数量是 1 Hz 时的 10 倍。

  3. 如果需要,添加具有相同标识符的额外信标以扩大覆盖范围。

当然,上述做法是有代价的,包括在高广告率和发射器功率水平下电池寿命缩短。

即使你做到了以上所有,你仍然需要软件过滤器,因为如果最近的信标的传输半径,总会有一个点在你的边缘.

你可以在我的回答中看到一个软件过滤代码的例子here.