ios - CLLocationManager 的委托函数“didRangeBeacon”没有找到任何信标?
问题描述
这个问题已经在这里问过了,但它并没有解决我的问题,我会在问题的最后解释为什么它不能解决问题。
我正在做的需要两个步骤:
让 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
. Apple 的文档是这样描述的:
此属性的值表示对等方的唯一标识符。本地管理器第一次遇到对等点时,系统会为对等点分配一个 UUID,由新的 NSUUID 对象表示。对等点由 NSUUID UUID 标识,而不是由标识外围设备的服务、特征和特征描述符的 CBUUID 对象标识。
基本上,此字段只是 iOS 分配给蓝牙设备的临时标识符。虽然它由 a 表示NSUUID
(在 Objective C 中或仅UUID
在 Swift 中调用),并且CLBeacon
/CLBeaconRegion
有一个proximityUUID
也是 的实例的字段NSUUID
,但它们的值不同。 这是一个常见的混淆来源。
不幸的是,不可能使用 CoreBluetooth API 来获取信标的 ProximityUUID。Apple 故意不遗余力地阻止您这样做。对不起。
推荐阅读
- typescript - 受保护的类型,仍然不可分配
- java - 在android中以编程方式生成facebook开发哈希键
- polymer - *ngIf 等效于 lit-element/polymer
- kubernetes - Calico IP-in-IP 连接问题与 Kubernetes 上的嵌套容器
- c# - 在 .net core 3.1 中创建和执行工作流
- axapta - 函数 SalesTable2LineField.lineUpdateDescription 使用不正确
- python - 使用 Python 的 Web Scraping table 只是返回一个空列表
- swift - 将 1 个视图向后导航,然后向前导航到另一个视图(Whit 动画看起来像正常的推送)
- c# - Microsoft.AspNet.OData:$filter 中的 URL 编码搜索值
- flutter - Flutter:合并两张图片,作为单张图片存储在本地存储中