【问题标题】:iBeacon region monitoring AND proximity for >20 beacons?超过 20 个信标的 iBeacon 区域监控和接近度?
【发布时间】:2014-10-12 19:17:54
【问题描述】:

我一直在开发一个原型 iOS 应用程序,该应用程序利用 iBeacons 向办公室员工提供与位置相关的信息,具体取决于他们在办公室的位置。理想的用例是,每当员工进入或离开他们的办公室时,都会触发回调,以通知的形式为他们提供一些信息(它可能会进行服务器查询以首先获取信息,等等 - 诸如此类)。我们还希望能够在应用程序后台或终止时执行此操作;幸运的是,我们已经知道,即使应用程序处于后台或暂停状态,越过信标区域边界也会触发相应的 CoreLocation 回调。

环顾四周,我大致了解,对于如何进行信标区域监控,我有两种选择:

  1. 为每个 iBeacon 提供自己的 CLBeaconRegion,并独立监控这些区域中的每一个。
  2. 监控与多个 iBeacon 对应的 CLBeaconRegion - 例如,每个 iBeacon 具有相同的 UUID,并且仅监控与该 UUID 对应的 CLBeaconRegion - 然后尝试使用测距确定哪个信标触发了边界穿越。

到目前为止,我选择了选项 #1。这种方法的优点是我得到了 didEnterRegion: 和 didExitRegion: 调用每个单独的信标并立即知道我进入/退出了哪个信标。另外,我只接到一个进入电话和一个退出电话,这正是我想要的。不幸的是,我刚刚意识到这种方法也将我限制为 20 个信标(因为每个信标都有自己的区域)。

我对#2 的具体实现细节不太熟悉,如果我错了,请纠正我。但似乎这种方法有更多的缺点:

  • Apple 不鼓励在应用处于后台时进行测距,因为结果可能不那么准确。
  • 测距调用每秒触发一次,而我只想进行“进入/退出”回调。
  • 如果信标有区域重叠,测距调用可能会不断翻转哪个“最近”,这会使事情变得更加复杂。

基本上,我想知道是否有一种方法可以利用选项 #2,但仍然具有选项 #1 的好处 - 一种快速简便的方法,可以立即确定哪个信标触发了区域更改,只需一次进入或退出打回来?

我希望这个问题足够清楚。在我自己的脑海中并不完全清楚,尤其是测距是如何工作的。

【问题讨论】:

    标签: ios ibeacon


    【解决方案1】:

    如果您对每个信标使用相同的 UUID,您只需设置主要/次要数字以区分不同的信标。这样,您只监视 1 个信标而不是 > 20 个。然后只需从其他标识符中找出哪个是哪个。这就是它目前与星巴克和其他零售商应用程序一起工作的方式。 1 个信标,无论您身在何处,都可以使用不同的标识符在后端进行分类。

    【讨论】:

    • 这就是我描述的选项#2。但是,您无法通过这种方式从 didEnterRegion: 或 didExitRegion: 获取信标信息(例如,主要和次要),因为我正在监视的区域仅配置了 UUID。
    • @bill burgess 如何使用单个 CLBeaconRegions 识别多个信标的测距? :)
    【解决方案2】:

    选项 #2 绝对更复杂,但您必须接受这些复杂性才能绕过 20 个区域的监控限制。

    几点:

    • 在后台,您只有大约 5 秒的测距时间,这并没有给您足够的时间来平均每个信标的 RSSI(信号强度)以获得良好的距离估计。所以,是的,估计会不太准确。如果您了解此限制并且可以在您的用例中接受它,那么在后台进行测距没有任何问题。

    • 是的,在进入区域后,每个信标都会收到多个测距调用,并且在区域退出时不会收到任何回调。你必须编写额外的代码来处理这个问题。我通过维护所有看到的唯一信标(相同的 uuid/major/minor)的 NSMutableArray 来做到这一点,并在测距回调中更新它。然后,您可以在区域退出回调中访问此数组,这样您就知道哪些信标消失了。当然,在 5 秒的背景测距时间到期后,可能会看到额外的信标,但您的应用程序永远不会知道它们。使用此选项,您必须接受此限制。

    • 虽然测距中的距离估计错误确实可能会错误地告诉您哪个信标最近,但在进行监控时会遇到更严重的问题,因为您根本无法获得距离估计。如果多个信标大约在同一时间进入监控范围,则无法保证您获得的第一个进入区域回调将针对最近的信标。因此,如果您的用例需要根据最近的信标采取行动,那么您必须进行测距(知道距离估计可能存在误差。)

    【讨论】:

    • 感谢大卫的详细回复!我见过一些例子,人们只在 didEnterRegion: 上调用 startRangingBeaconsInRegion:,在 didExitRegion: 中调用 stopRangingBeaconsInRegion:。您建议这样做,还是在开始监视区域时只开始测距信标,并且永不停止测距?
    • 我认为没有理由继续开始/停止测距。 iOS 将强制您无论如何都不能在后台进行测距(进入/退出事件后 5 秒除外),因此您的应用不会通过打开测距来使用任何额外的资源。
    【解决方案3】:

    第二种方法的缺点是检测特定信标的进入将纯粹基于测距,如果应用程序被终止,这将不起作用。原因是我们只会得到一次 didEnterRegion,因为我们只监控一个具有特定 UID 的区域。如果应用程序终止或后台测距停止,则不会再次检测到具有相同 UID 的下一个信标。

    我建议结合上述方法,

    • 对所有信标使用相同的 UID。

    • 使用测距时收集的主要/次要值唯一标识信标。

    • 正如苹果文档中提到的,当用户从一个信标移动到另一个信标时,通过删除和添加信标,始终保持监控区域的数量低于 20(最好在服务器中保留一个信标邻居关系图。)

    • 进入区域时开始测距...并识别主要/次要并计算接近度。

    • 退出区域时停止测距。
    • 从测距方法中找到最近的信标(需要跳过未知范围的信标)。
    • 在给定时间内仅监控最近信标的邻居。

    在实现这两个选项时,我们应该考虑一个事实,即会在 200 英尺距离内检测到 iBeacon。 200 英尺范围内可能有多个信标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2017-12-10
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多