是否可以在 iBeacon 应用程序上动态设置 UUID?
Posted
技术标签:
【中文标题】是否可以在 iBeacon 应用程序上动态设置 UUID?【英文标题】:Is it possible to dynamically set UUID on iBeacon app? 【发布时间】:2016-04-20 23:41:10 【问题描述】:我有一个信标设备,它根据自定义轮换方案广播不同的 UUID 值。
通常,开发者必须设置静态 UUID 才能被应用识别(ios 示例):
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:major minor:minor identifier:identifier];
我想知道是否有办法动态生成(或从服务器接收)要识别的 UUID。
话虽如此,我仍然难以理解 iOS 和 android 如何理解信标的内部机制。据我了解,手机的 BLE 模块将所有格式正确的 iBeacons 转发到操作系统,该操作系统维护一个已识别的 UUID 列表。经过简单的查找并找到匹配项后,操作系统会将相应的应用程序带到前台。
但是,应用识别的 UUID 何时在操作系统中注册?他们多久重新注册一次?如果有人能指出任何相关的在线材料或至少提及此过程中涉及的机制,我将不胜感激。
【问题讨论】:
【参考方案1】:在 Android 和 iOS 上注册 Beacon ProximityUUID 以检测无非是对匹配 Beacon 和 ProximityUUID 的字节模式的蓝牙数据包应用过滤器。重要的区别在于,在 iOS 上,执行过滤的操作系统框架 CoreLocation 对您可以拥有的过滤器设置了严格的限制。 iOS 限制包括:
对于单个应用,您在任何给定时间只能监控 20 个 UUID。 设备范围内监控的前 30 个 UUID 的限制获得硬件辅助快速检测。稍后注册的 UUID 检测速度会变慢(后台延迟几分钟)。 您无法监控或范围内的任何 UUID(全局通配符)不过,您可以随时更改您的应用监控的 20 个 UUID,甚至每隔几秒更改一次。诀窍是您的应用必须在前台执行此操作,或者有允许的方式在后台运行以执行此 UUID 轮换。
要在 iOS 上注册一个用于监控的 UUID,您只需使用该 UUID 声明一个区域(通常不指定主要和次要值)然后调用:
[locationManager startMonitoringForRegion:region];
为了避免超过 20 个区域的限制,您还必须致电:
[locationManager stopMonitoringForRegion:oldRegion];
在您不想再监控的旧区域。否则,如果您超过 20 个限制,您将无法检测到新注册的区域。
当然,您可以使用网络服务来提供 UUID,以便您的新区域进行监控。
在 Android 上要简单得多——您可以通过使用 Android 信标库和类似的 SDK 指定全局通配符来监控所有 UUID。
全面披露:我是 Android 信标库的首席开发人员,这是该平台上的第一个信标实现。
【讨论】:
我也在这里阅读了您关于每个应用程序 20 个 UUID 限制的评论:developer.apple.com/library/ios/documentation/UserExperience/… 但我必须说我刚刚实现了一个应用程序,它可以覆盖 40 多个不同的区域(每个区域都有不同的 UUID)它没有给我任何错误。我使用 macbeacon 而不是真正的信标,所以我每秒只能测试一个 UUID(没有并发 UUID)。此外,我使用的设备是 iPhone 6s plus,应用程序正在前台运行。有什么变化吗? “无异于对蓝牙数据包应用过滤器”在 Android 中这个过滤过程是 Android 信标库的一部分吗?如果是这样,考虑到大量允许的 UUID(+主要,次要)以及一个区域中可能捕获的大量信标,这种匹配如何有效?我认为它必须是一个渐进的逐字节方案。 是的,更准确地说,iOS 上的 20 个区域限制仅适用于监控 API,而不适用于范围 API。但由于测距通常仅限于前景,因此需要注意背景检测的限制。 是的,Android Beacon 库会进行过滤。虽然没有什么可以阻止您为不同的 UUID 设置数千个过滤器,但显然这将是一个性能问题。更具可扩展性的解决方案是使用完整的通配符区域(无过滤)来查看所有信标,而不考虑 UUID。以上是关于是否可以在 iBeacon 应用程序上动态设置 UUID?的主要内容,如果未能解决你的问题,请参考以下文章