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 且具有唯一输入的信标
iBeacons - locationManager:didEnterRegion 回调和 UUID