CLLocationManager 的委托函数“didRangeBeacon”没有找到任何信标?

Posted

技术标签:

【中文标题】CLLocationManager 的委托函数“didRangeBeacon”没有找到任何信标?【英文标题】:CLLocationManager's delegate function 'didRangeBeacon' doesn't find any beacons? 【发布时间】:2018-10-20 15:13:08 【问题描述】:

这个问题已经被问到here,但它并没有解决我的问题,我会在问题的最后解释为什么它没有解决问题。

我正在做的事情需要两个步骤:

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

【问题讨论】:

【参考方案1】:

问题出在这句话上:

我通过以下委托方法找到了我的信标的 UUID:

 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) 
     print(peripheral.identifier)
 

peripheral.identifier 返回的值不是您的信标的proximityUUID因此,didRangeBeacons 返回一个空数组,因为附近没有带有@987654326 的信标@匹配你设置的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。 Apple 故意不遗余力地阻止您这样做。对不起。

【讨论】:

以上是关于CLLocationManager 的委托函数“didRangeBeacon”没有找到任何信标?的主要内容,如果未能解决你的问题,请参考以下文章

CLLocationManager 从不调用委托方法[重复]

CLLocationManager 如何根据 iOS 版本调用正确的委托方法

CLLocationManager 委托方法 didUpdateToLocation 没有被调用

XCTest CLLocationManager 的委托方法不会被调用

CLLocationManager委托方法未被调用

CLLocationManager 区域监控委托类问题