这个问题已经被问过了,但它没有解决我的问题,我会在问题的最后解释为什么它没有解决问题。
我要做的是两个步骤:
让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/