CLLocationManager的委托函数'didRangeBeacon'找不到任何信标?

时间:2018-10-20 15:13:08

标签: ios swift beacon cbperipheral

这个问题已被here问到,但它不能解决我的问题,我将在问题结尾解释为什么它不能解决问题。

我在做什么需要2个步骤:

  1. 让CBCentralManager发现外围设备

  2. 让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时,我们应该提供一个唯一的标识符,我已经在这样做了。

1 个答案:

答案 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 。苹果公司有意竭尽全力阻止您这样做。抱歉。