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

Ios iBeacon区域监控和接近>;20个信标?,ios,ibeacon,Ios,Ibeacon,我一直在开发一个iOS原型应用程序,利用iBeacons向办公室员工提供位置相关信息,具体取决于他们在办公室的位置。理想的使用案例是,每当员工进出办公室时,都会触发回调,以通知的形式向他们提供一些信息(可能会进行服务器查询以首先获取信息,诸如此类)。我们也希望能够做到这一点时,应用程序是后台或终止;幸运的是,我们已经知道,信标区域边界交叉会触发适当的CoreLocation回调,即使应用程序是后台或挂起的 环顾四周,我大致了解到,对于如何进行信标区域监控,我有两种选择: 为每个iBeacon指定

我一直在开发一个iOS原型应用程序,利用iBeacons向办公室员工提供位置相关信息,具体取决于他们在办公室的位置。理想的使用案例是,每当员工进出办公室时,都会触发回调,以通知的形式向他们提供一些信息(可能会进行服务器查询以首先获取信息,诸如此类)。我们也希望能够做到这一点时,应用程序是后台或终止;幸运的是,我们已经知道,信标区域边界交叉会触发适当的CoreLocation回调,即使应用程序是后台或挂起的

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

  • 为每个iBeacon指定其自己的CLBeaconRegion,并独立监视这些区域中的每个区域
  • 监视对应于多个iBeacon的CLBeaconRegion(例如,每个iBeacon具有相同的UUID,并且仅监视对应于该UUID的CLBeaconRegion),然后尝试使用测距确定哪个信标触发了边界交叉
  • 到目前为止,我选择了选项1。这种方法的优点是,我得到每个信标的didEnterRegion:和didExitRegion:调用,并立即知道我已进入/退出哪个信标。而且,我只收到一个进入呼叫和一个退出呼叫,这正是我想要的。不幸的是,我刚刚意识到这种方法也将我限制在20个信标(因为每个信标都有自己的区域)

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

    • 苹果不鼓励在应用程序处于后台时进行测距,因为结果可能不那么准确
    • 测距呼叫每秒触发一次,而我只希望有“进入/退出”回调
    • 如果信标有区域重叠,测距呼叫可能会不断翻转哪一个是“最近的”,这将使事情进一步复杂化
    基本上,我想知道是否有一种方法可以利用选项2,但仍然有选项1的好处——一种快速简便的方法,可以通过一次输入或退出回调立即确定哪个信标触发了区域更改


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

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

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

    有几点:

    • 在背景中,您只有大约5秒的测距时间,这并没有给您足够的时间来平均每个信标的RSSI(信号强度)以获得良好的距离估计。因此,是的,估计的准确性会降低。如果您理解这个限制,并且能够在您的用例中接受它,那么在后台进行测距没有什么错

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

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


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

    我建议结合上述方法

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

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

    • 正如apple doc中提到的,当用户从一个信标移动到另一个信标时,通过移除和添加信标,始终将监控区域的数量保持在20以下(最好在服务器中保留信标-邻居关系图)

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

    • 退出区域时停止测距
    • 从测距方法中查找最近的信标(需要跳过未知距离信标)
    • 在给定时间内仅监视最近信标的邻居
    当实施这两个选项时,我们应该考虑一个事实,即iBeaCon。