除非在区域设置中指定,否则不会检测到 iBeacon 的 major/minor

iBeacon's major/minor is not detected unless it's specified in the region's settings

我遇到的问题相当简单——我知道我正在使用的 iBeacon 的 uuid,但是 major/minor 参数没有预设,即它们可能会动态变化。我想要实现的是在 BeaconManager 调用 MonitorNotifier 的方法时能够获取 major/minor 的当前值。出于某种原因,如果区域仅使用 uuid 构建,它不会在 MonitorNotifier 中传递 major/minor,例如:

val region = Region(uuid.toString(), Identifier.fromUuid(uuid));

我与通过本机 iOS API 使用 iBeacon 的 iOS 开发人员进行了交谈,他说 iOS 上的行为完全相同 - major/minor 是不通过监控提供,除非他指定要搜索的确切值。

major/minor 可以通过测距检测到,但我想继续使用监控是有原因的(无需深入研究细节 - 使用 [=15= 更容易]、didExitdidDetermineStateForRegion 方法)。

有什么我可能遗漏的吗?

您对信标监控 API 工作方式的描述是准确的。 iOS CoreLocation 与 Android Beacon 库相同。

我是 API 在 Android 信标库上设计这个的人。它以这种方式工作,因为我希望它可以轻松构建跨平台应用程序,所以我将其设置为与 iOS.

相同

iOS 以这种方式工作的原因是因为 Apple 在其先前存在的地理围栏区域 API 上对其进行了建模,它还会告诉您何时进入或退出,但不会为您提供更多详细信息关于导致进入或退出的细节。

您当然可以争论不同的 API 是否会更好。遗憾的是,在使用 SDK 时,您必须按原样接受 API。另一种方法是建立自己的。

如果您真的想要针对检测到的特定信标/不再检测到信标的事件进行事件回调,您可以轻松地在 Ranging APIs 之上构建它。只需跟踪所有可见信标的列表,并在发现新信标时触发 didStertDetectingBeacon 事件。然后,如果 10 秒过去了,在测距回调中没有看到它,则触发 didStopDetectingBeacon 回调。