iBeacon区域监控和接近> 20个信标?

时间:2014-08-19 15:43:33

标签: ios ibeacon

我一直致力于使用iBeacons的原型iOS应用程序,根据办公室员工的位置向办公室员工提供位置相关信息。理想的用例是,每当员工进入或离开他们的办公室时,都会触发一个回调,它以通知的形式向他们提供一些信息(它可能会使服务器查询以获取信息等等 - 这类事情)。我们还希望能够在应用程序后台或终止时执行此操作;幸运的是,我们已经知道,即使应用程序背景或暂停,信标区域边界交叉也会触发相应的CoreLocation回调。

从环顾四周来看,我明白,对于如何进行信标区域监控,我有两种选择:

  1. 为每个iBeacon提供自己的CLBeaconRegion,并独立监控每个区域。
  2. 监视对应于多个iBeacons的CLBeaconRegions - 例如,每个iBeacon具有相同的UUID并且仅监视与该UUID相对应的CLBeaconRegion - 然后尝试使用范围确定哪个信标触发了边界交叉。
  3. 到目前为止,我选择了#1选项。这种方法的优点是我得到didEnterRegion:和didExitRegion:调用每个单独的信标,并立即知道我输入/退出的信标。此外,我只收到一个来电和一个退出电话,这正是我想要的。不幸的是,我刚刚意识到这种方法也限制了我20个信标(因为每个信标都有自己的区域)。

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

    • 当应用程序在后台时,Apple不鼓励测距,因为结果可能不准确。
    • 测距呼叫每秒触发一次,而我只想进入&退出"回调。
    • 如果信标有区域重叠,则测距呼叫可能会不断翻转哪一个是最近的",这会使事情进一步复杂化。

    基本上,我想知道是否有办法利用选项#2,但仍然有选项#1的好处 - 一种快速简便的方法,可以通过一次输入立即确定哪个信标触发了区域变化还是退出回调?

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

3 个答案:

答案 0 :(得分:10)

选项#2绝对更复杂,但您必须接受这些复杂情况才能达到20区域监控限制。

几点:

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

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

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

答案 1 :(得分:6)

第二种方法的缺点是检测特定信标的输入将完全基于测距,如果应用程序被杀死则不起作用。原因是我们只会获得一次didEnterRegion,因为我们只监视一个具有特定UID的区域。如果应用程序终止或背景范围停止,则不会再次检测到具有相同UID的下一个信标。

我建议结合使用上述方法,

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

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

  • 如苹果文档中所述,当用户从信标移动到信标时,通过删除和添加信标,始终将监控区域的数量保持在20以下(更好地在服务器中保留信标邻居关系图。)

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

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

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

答案 2 :(得分:2)

如果对每个信标使用相同的UUID,则只需设置主要/次要编号即可区分不同的信标。这样,您只监控1个信标而不是> 20.然后只需从其他标识符中挑选出哪一个。这就是目前星巴克和其他零售商应用程序的工作原理。 1个信标,无论你在世界的哪个地方,还有不同的标识符,用于在后端排序。