iBeacon 监控具有相同 UUID 和不同主要、次要的多个信标

Posted

技术标签:

【中文标题】iBeacon 监控具有相同 UUID 和不同主要、次要的多个信标【英文标题】:iBeacon monitoring multiple beacons with same UUID and different major, minor 【发布时间】:2019-02-19 18:28:10 【问题描述】:

我有多个具有相同 UUID 但主次编号不同的 iBeacon。它可以是主要和次要的不同组合,但 UUID 保持不变。比如说,

设备 #1 - UUID xyz,主要 1,次要 1 设备 #2 - UUID xyz,主要 1,次要 2 设备 #3 - UUID xyz,主要 2,次要 1 ..... 设备 #n - UUID xyz,主要 10,次要 1

此外,这些 iBeacon 位于 1 到 50 英尺之间。因此,它们的区域可以相互交叉。

在我的 ios 应用程序中,我想检测该区域中具有相同 UUID 的所有 iBeacons,然后遍历它们并读取每个 iBeacons 的主要和次要以检测已检测到哪一个。

我可以使用吗 init(proximityUUID: UUID, identifier: String) 使用我的 UUID 然后遍历它们?

【问题讨论】:

【参考方案1】:

有两种不同的 iOS CoreLocation API,您需要使用第一个来达到此目的:

1.信标测距(你想要什么)

您调用locationManager.startRangingBeacons(in: region) 时使用的区域定义将主要和次要为零。您显示的构造函数 init(proximityUUID: UUID, identifier: String) 正是这样做的。

这将为您提供每秒一次对locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) 的回调,其中包含与您的区域定义匹配的所有CLBeacon 对象的数组。你可以遍历这个数组来查看所有这些。

2。信标监控(你不想要的)

您调用 locationManager.startMonitoring(region: region) 时使用的区域定义将主要和次要为零。

这将为您提供一个回调到 locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) 或等效的 didExitRegion 方法,每次至少出现 一个 与区域定义匹配的信标,或 所有 与区域定义匹配的信标区域消失。

这不会让您遍历所有匹配的信标,因为回调只包括区域定义而不是匹配的信标列表。

【讨论】:

感谢您的详细回答。如果我想知道其中一个 iBeacons 是否超出范围,因为我不听 didExitRegion 回调,我是否应该定期调用 startMonitoring 手动查看我是否离开了具有特定主要和次要的区域? 不,API 不能那样工作。如果您想知道某个特定的主要次要是否已经消失,您必须设置一个新区域以在特定信标被测距后对其进行监控,但您只能这样做一次。但请注意,您最多只能有 20 个监控区域,因此您不能超过该限制,并且必须在每个区域消失后停止监控。更好的方法是跟踪您看到每个主要次要组合的最后一个时间戳,并且当一个时间戳结束时触发你的超出范围的逻辑,比如过去 10 秒。 另外,请记住,信标监控非常高效,特别适合在应用程序不活动时收听信标。一个好的做法是监控信标并在监控检测到信标时开始测距。【参考方案2】:

是的,你绝对可以!当检测到另一个 iBeacon 时,您不会收到新的委托通知,除非您创建具有不同 ID 的多个侦听器,但是一旦您位于给定 UUID 的区域中,您就可以遍历范围内的所有信标并获取它们的主要和次要

【讨论】:

以上是关于iBeacon 监控具有相同 UUID 和不同主要、次要的多个信标的主要内容,如果未能解决你的问题,请参考以下文章

对于具有不同 UUID、major 和 minor 的多个 iBeacon,仅触发一次 didEnterRegion 事件

CoreBluetooth 监控 100 个具有相同 UUID 且具有唯一输入的信标

检测具有不同主要和次要值的 iBeacon

iBeacons - locationManager:didEnterRegion 回调和 UUID

基于 UUID 监控 iBeacon 区域时,何时收到通知?

嗅探具有接近 UUID 主要次要的 ibeacon 包