我正在开发的iPhone应用程序需要在前景和后台使用CBCentralManager
建立本地连接后立即每秒读取外围设备的RSSI。这意味着在调用CBCentralManagerScanOptionAllowDuplicatesKey
时将true
设置为scanForPeripherals(withServices:options:)
是不可能的,因为当应用程序在后台运行时它被忽略,并且它仅通过{{1启用RSSI更新}} CBCentralManagerDelegate
方法,此时外围设备尚未连接。
受this answer的启发我在外设中实现了一个具有centralManager(_:didDiscover:advertisementData:rssi:)
属性的特性,并且每秒更新一次。在我的应用中,我使用notify
的{{1}}方法通过CBPeripheral
通知特征更新。在这种方法中,我调用setNotifyValue(_:for:)
并通过peripheral(_:didUpdateValueFor:error:)
大致每秒获得一次RSSI更新。
我的代码的简化版本如下所示:
peripheral.readRSSI()
结合核心蓝牙状态保存和恢复的正确实现,这似乎工作得很好。即使这似乎是一个可接受的解决方案,我仍然想知道是否有其他解决方案不依赖于外设中的自更新特性。
我已经考虑过使用iBeacon(与蓝牙外设并行),但这对我们来说不是一个好的解决方案,因为它很容易被欺骗,我们在设置连接时依赖某些验证方法来确保外设是真的
是否有人使用Core Bluetooth在前台和后台应用状态下轮询蓝牙外设的RSSI?您是否找到了替代/不同/更好的解决方案?