CLLocationManager 的委托函数 'didRangeBeacon' 没有找到任何信标?
CLLocationManager's delegate function 'didRangeBeacon' doesn't find any beacons?
这个问题有人问过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
时,我们应该提供一个唯一标识符,我已经这样做了。
这个语句有问题:
I found out the UUID of my beacon with the following delegate method:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) {
print(peripheral.identifier)
}
peripheral.identifier
返回的值不是您的信标的 proximityUUID
。 因此,didRangeBeacons
returns空数组,因为附近没有信标 proxmityUUID
与您设置的 CLBeaconRegion
匹配。
这里有更深入的解释:
peripheral.identifier
字段来自 CBPeripheral
对象,它继承自 CBPeer
。苹果的文档here是这样描述的:
The value of this property represents the unique identifier of the peer. The first time a local manager encounters a peer, the system assigns the peer a UUID, represented by a new NSUUID object. Peers are identified by NSUUID UUIDs instead of by the CBUUID objects that identify a peripheral’s services, characteristics, and characteristic descriptors.
基本上,这个字段只是iOS分配给蓝牙设备的临时标识符。虽然它由 NSUUID
表示(在 Objective C 中称为或 Swift 中称为 UUID
),并且 CLBeacon
/CLBeaconRegion
具有proximityUUID
字段也是 NSUUID
的一个实例,它们不是相同的值。 这是一个常见的混淆来源。
不幸的是,无法使用 CoreBluetooth API 获取信标的 ProximityUUID。 Apple 故意竭尽全力阻止您这样做。对不起。
这个问题有人问过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
时,我们应该提供一个唯一标识符,我已经这样做了。
这个语句有问题:
I found out the UUID of my beacon with the following delegate method:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String: Any], rssi RSSI: NSNumber) { print(peripheral.identifier) }
peripheral.identifier
返回的值不是您的信标的 proximityUUID
。 因此,didRangeBeacons
returns空数组,因为附近没有信标 proxmityUUID
与您设置的 CLBeaconRegion
匹配。
这里有更深入的解释:
peripheral.identifier
字段来自 CBPeripheral
对象,它继承自 CBPeer
。苹果的文档here是这样描述的:
The value of this property represents the unique identifier of the peer. The first time a local manager encounters a peer, the system assigns the peer a UUID, represented by a new NSUUID object. Peers are identified by NSUUID UUIDs instead of by the CBUUID objects that identify a peripheral’s services, characteristics, and characteristic descriptors.
基本上,这个字段只是iOS分配给蓝牙设备的临时标识符。虽然它由 NSUUID
表示(在 Objective C 中称为或 Swift 中称为 UUID
),并且 CLBeacon
/CLBeaconRegion
具有proximityUUID
字段也是 NSUUID
的一个实例,它们不是相同的值。 这是一个常见的混淆来源。
不幸的是,无法使用 CoreBluetooth API 获取信标的 ProximityUUID。 Apple 故意竭尽全力阻止您这样做。对不起。