这个问题已被here问到,但它不能解决我的问题,我将在问题结尾解释为什么它不能解决问题。
我在做什么需要2个步骤:
让CBCentralManager发现外围设备
让CLLocationManager监听在步骤1中发现的信标
我通过以下委托方法找到了我的信标的UUID:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
print(peripheral.identifier)
}
然后发生步骤2:
if let uuid = UUID.init(uuidString: "<identifier found in step 1>") {
locationManager.startRangingBeacons(in: .init(proximityUUID: uuid, identifier: UUID().uuidString))
}
我的locationManager的委托方法只打印范围内的所有信标:
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
print(beacons)
}
但是我得到的只是一个空数组。为什么?我该如何解决?
上面列出的问题表明,在创建CLBeaconRegion
时,我们应该提供一个唯一的标识符,我已经在这样做了。
答案 0 :(得分:2)
问题在于以下语句:
我通过以下委托方法找到了我的信标的UUID:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) { print(peripheral.identifier) }
peripheral.identifier
返回的值不是您的信标的proximityUUID
。因此,didRangeBeacons
返回一个空数组,因为其中没有信标proxmityUUID
与您设置的CLBeaconRegion
匹配的区域。
这是更深入的解释:
peripheral.identifier
字段来自CBPeripheral
对象,该对象继承自CBPeer
。 Apple的文档here是这样描述的:
此属性的值表示对等方的唯一标识符。本地管理者第一次遇到对等方时,系统会为对等方分配一个UUID,用一个新的NSUUID对象表示。对等点是由NSUUID UUID标识的,而不是由标识外围设备的服务,特征和特征描述符的CBUUID对象标识的。
基本上,此字段只是iOS分配给蓝牙设备的临时标识符。虽然它由NSUUID
表示(在Objective C中称为,或者在Swift中只是UUID
),但CLBeacon
/ CLBeaconRegion
的字段为proximityUUID
也是NSUUID
的一个实例,它们的值不相同。这是造成混淆的常见原因。
不幸的是,不可能使用CoreBluetooth API获取信标的ProximityUUID 。苹果公司有意竭尽全力阻止您这样做。抱歉。