从周围看,我明白,我有两个方法来处理信标区域监控:
>给每个iBeacon自己的CLBeacon区域,并独立监控每个这些地区.
>监视对应于多个iBeacons的CLBeaconRegions,例如,每个iBeacon具有相同的UUID,并且仅对与该UUID相对应的CLBeaconRegion进行监视,然后尝试确定哪个信标通过测距触发了边界.
到目前为止,我选择了#1选项.这种方法的优点是我得到didEnterRegion:didExitRegion:调用每个单独的信标,并立即知道我进入/退出哪个信标.此外,我只收到一个进入呼叫和一个退出呼叫,这正是我想要的.不幸的是,我只意识到这种方法也限制了我20个信标(因为每个信标都有自己的区域).
我不熟悉#2的确切实现细节,所以如果我错了就纠正我.但似乎这种方法有更多的缺点:
>苹果在应用程序处于背景状态时不鼓励使用,因为结果可能不准确.
>测距功能每秒钟都会触发一次,而我只想要进入/退出回调.
>如果信标具有区域重叠,则测距呼叫可能不断地翻转哪一个是“最接近”的,这将使事情进一步复杂化.
基本上,我想知道是否有一种方法来利用选项#2,但仍然具有选项1的好处 – 一种快速和容易的方法,可以立即确定哪个信标触发区域只有一个进入或退出回调?
我希望这个问题足够清楚.在我自己的头脑里,并不是完全清楚,特别是范围如何工作.
解决方法
几点:
>在后台,你只有约5秒的测距时间,这并没有给你太多的时间来平均每个信标的RSSI(信号强度)来获得很好的距离估计.所以,是的,估计不太准确.如果你明白这个限制,并且可以根据你的用例生活,那么在背景中没有什么问题.>是的,您可以在区域输入后每个信标灯获得多个测距呼叫,并且您不会在区域退出时得到任何回调.你必须编写额外的代码来照顾这个.我已经通过维护所有独特的信标(同样的uuid / major / minor)的NSMutableArray,并在更改回调中进行更新.然后,您可以在区域退出回调中访问此数组,以便您知道哪些信标消失了.当然,在5秒的背景测试时间到期后,可能会看到额外的信标,但是你的应用程序将永远不会知道它们.使用此选项,您必须接受此限制.>尽管测距中的距离估计误差可能会错误地告诉您哪个信标最接近,但是在进行监控时,您会遇到更糟糕的问题,因为您根本无法估计距离.如果多个信标在同一时间进入监控范围,则不能保证您获得的第一个输入区域回调将是最接近的信标.因此,如果您的用例需要根据最近的信标采取行动,那么您必须进行测距(知道距离估计可能会有错误).