我一直在开发一个基于iBeacon的iOS原型应用程序,根据办公室员工所在的位置提供与位置相关的信息。理想情况是每当员工进入或离开办公室时,都会触发回调,以通知他们相关信息(可能需要首先进行服务器查询等操作)。我们还希望在应用程序后台运行或终止时也能实现这一点;幸运的是,我们已经知道即使应用程序处于后台或挂起状态,信标区域边界越过也会触发适当的CoreLocation回调。
从我的调研中得知,我有两种方法来处理信标区域监控:
- 为每个iBeacon提供自己的CLBeaconRegion,并独立地监视每个这些区域。
- 监视对应于多个iBeacon的CLBeaconRegion - 例如,每个iBeacon具有相同的UUID,只监视对应于该UUID的CLBeaconRegion - 然后尝试使用测距法确定哪个信标触发了边界越界。
迄今为止,我选择了第一种方法。这种方法的优点是我可以为每个单独的信标获取didEnterRegion:和didExitRegion:调用,并立即知道我进入/退出的是哪个信标。而且,我只会获取一次进入和一次退出的调用,这正是我想要的。不幸的是,我刚意识到这种方法也限制了我最多只能使用20个信标(因为每个信标都有自己的区域)。
对于第二种方法的具体实现细节,我不是很熟悉,如果我有错误,请纠正我。但是似乎这种方法有更多缺点:
- 当应用程序处于后台时,Apple不鼓励进行测距,因为结果可能不太准确。
- 测距调用每秒钟触发一次,而我只想要“进入/退出”回调。
- 如果信标存在区域重叠,测距调用可能会不断地翻转哪一个信标是“最近的”,这将进一步复杂化事情。
基本上,我想知道是否有一种方法可以利用选项#2,但仍然具有选项#1的优点——只需一个进入或退出回调即可快速轻松地确定哪个信标触发了区域更改?
希望这个问题足够清楚。在我的脑海中并不完全清晰,尤其是测距的工作原理。