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

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

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

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

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

谢谢你的时间!

最佳答案

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

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

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

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

  • 将您的信标发射器功率调到最大。这将在您关心的区域提供更强的信号电平和更少的丢失数据包。
  • 将广告率调到最大。 10 Hz 的广告提供 10 倍于 1 Hz 的接收数据包。
  • 如果需要,添加具有相同标识符的附加信标以增加覆盖范围。

  • 当然,以上这些都是有代价的,包括在高广告费率和发射机功率水平下电池生命周期缩短。

    即使您执行了上述所有操作, 您仍然需要软件过滤器 ,因为如果最近的信标的传输半径,总会有一个您处于边缘的点。

    您可以在我的回答 here. 中看到软件过滤器代码的示例

    关于objective-c - 具有不可靠结果的 iBeacon 监控(didEnterRegion 和 didExitRegion),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36405896/

    10-13 07:24