【发布时间】:2014-10-12 19:17:54
【问题描述】:
我一直在开发一个原型 iOS 应用程序,该应用程序利用 iBeacons 向办公室员工提供与位置相关的信息,具体取决于他们在办公室的位置。理想的用例是,每当员工进入或离开他们的办公室时,都会触发回调,以通知的形式为他们提供一些信息(它可能会进行服务器查询以首先获取信息,等等 - 诸如此类)。我们还希望能够在应用程序后台或终止时执行此操作;幸运的是,我们已经知道,即使应用程序处于后台或暂停状态,越过信标区域边界也会触发相应的 CoreLocation 回调。
环顾四周,我大致了解,对于如何进行信标区域监控,我有两种选择:
- 为每个 iBeacon 提供自己的 CLBeaconRegion,并独立监控这些区域中的每一个。
- 监控与多个 iBeacon 对应的 CLBeaconRegion - 例如,每个 iBeacon 具有相同的 UUID,并且仅监控与该 UUID 对应的 CLBeaconRegion - 然后尝试使用测距确定哪个信标触发了边界穿越。
到目前为止,我选择了选项 #1。这种方法的优点是我得到了 didEnterRegion: 和 didExitRegion: 调用每个单独的信标并立即知道我进入/退出了哪个信标。另外,我只接到一个进入电话和一个退出电话,这正是我想要的。不幸的是,我刚刚意识到这种方法也将我限制为 20 个信标(因为每个信标都有自己的区域)。
我对#2 的具体实现细节不太熟悉,如果我错了,请纠正我。但似乎这种方法有更多的缺点:
- Apple 不鼓励在应用处于后台时进行测距,因为结果可能不那么准确。
- 测距调用每秒触发一次,而我只想进行“进入/退出”回调。
- 如果信标有区域重叠,测距调用可能会不断翻转哪个“最近”,这会使事情变得更加复杂。
基本上,我想知道是否有一种方法可以利用选项 #2,但仍然具有选项 #1 的好处 - 一种快速简便的方法,可以立即确定哪个信标触发了区域更改,只需一次进入或退出打回来?
我希望这个问题足够清楚。在我自己的脑海中并不完全清楚,尤其是测距是如何工作的。
【问题讨论】: