iBeacon是一个区域,其定义属性为UUID。因此,您只能搜索与特定UUID匹配的iBeacon。 通过使用委托回调,您可以找到具有特定UUID的一个或多个iBeacon,并确定哪个离您最近,在这个过程中,iBeacon存储在一个根据距离排序的数组中。 有很好的示例代码以及相当详细的WWDC视频会议:"Core Location新功能"
iBeacons是比普通BLE外设更高级别的构造。从苹果文档中可以确定,beacons与其服务UUID相关联。也就是说,一组beacons是一个“区域”,你会进入和退出一个区域,基于beacon对于你的范围和可见性,而不是相反。遗憾的是,苹果使用了术语“区域”,这大多数人可能会将其与MapKit相关联,因此增加了普遍的混淆。坏消息是:你只能扫描你知道的ProximityUUIDs,没有“通配符”ProximityUUID。此外,CLBeacons在CoreBluetooth底层方面没有公开太多东西,因此如果您想找到附近所有的beacons,您将需要使用CoreBluetooth来扫描外设,然后查看返回的外设并查询每个外设以查找beacon。当然,苹果既没有向Bluetooth SIG注册iBeacon特性,也没有(但)发布它,因此您需要一个BT嗅探器来反向工程分析何为iBeacon与任何其他BLE设备的区别。
很遗憾,目前您无法在不事先知道proximityUUID值的情况下搜索任意iBeacon。我曾尝试直接编写COREBluetooth,虽然您可以发现并连接到区域内的发射信标,但是您得到的返回信息是无关BLE UUID的胡言乱语。因此,您甚至无法确认已连接的外围设备实际上是iBeacon。这似乎不是BLE规范的限制,而是由苹果强加的限制。同样,Android平台似乎不存在这种限制。在填补这个差距之前,Android在这个领域将比iOS具有显着优势。我不同意以前的评论认为扫描UUID是无用的。相反,如果您知道信标UUID,您可以在云中创建信标/位置/主题地图,并使用它来导航(假设信标是固定的)使用网络服务。您可以众包数据,以便终究所有想要编写位置应用程序的人都可以获得非常丰富的信标UUID /位置对数据库。也许这就是苹果隐藏信息的原因;他们可能将这些信息保留给自己的目的。
每个应用程序都会使用自己特定的UUID,使用“major”和“minor”整数值来区分信标。例如,UUID将与一系列商店相关联,major将识别商店,而minor则是过道,甚至是一组产品。扫描未知的UUID不是很有用,因为您的应用程序不知道如何处理这些信息。UUID仅需生成一次,使用终端中的“uuidgen”命令即可。遗憾的是,实际上没有与信标通信的协议,因此没有获取信标位置或任何其他有用信息的标准。如果我们可以打开到信标的连接(通常是最近的一个),并从中获取其他数据,而无需在同一WIFI网络上,那将会更好。您可以使用Bonjour通过WIFI与设备通信,也可以使用major和minor ID从某种WebService中获取数据。