这个问题已经被问过了,但它没有解决我的问题,我会在问题的最后解释为什么它没有解决问题。
我要做的是两个步骤:
让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时,我们应该给出一个唯一的标识符,我已经在做了。

最佳答案

问题在于这句话:
我使用以下委托方法找到了我的信标的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继承它。苹果的文档是这样描述的:
此属性的值表示对等方的唯一标识符。当本地管理器第一次遇到对等机时,系统会为对等机分配一个UUID,由一个新的nsuid对象表示。对等点由nsuid uuid标识,而不是由标识外围设备的服务、特征和特征描述符的CBUUID对象标识。
基本上,这个字段只是iOS分配给蓝牙设备的一个临时标识符。虽然它由NSUUID表示(在Objective C中称为UUID,在Swift中称为CLBeacon),并且CLBeaconRegion/proximityUUID有一个NSUUID字段,也是的一个实例,但它们不是同一个值。这是一个常见的困惑。
不幸的是,不可能使用CORILE蓝牙API来获得你的信标的近邻。苹果公司故意想方设法阻止你这么做。对不起的。

关于ios - CLLocationManager的委托(delegate)函数'didRangeBeacon'找不到任何信标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52907089/

10-13 07:19