我一直在玩Corebluetooth并且我已经了解到,除了每次想要连接时都经过繁琐的扫描外围设备的过程,我还可以存储外围设备的UUID并将其与retrievePeripheralsWithIdentifiers和connectPeripheral一起使用以进一步重新连接。
事实证明它只能运行一段时间,显然外围设备的UUID已更新,因此存储的可以被视为过期。
我无法在此找到任何一致的文档,因此我不确定它会持续多长时间。
有没有办法解决这个问题,以便以后重新连接比再次扫描外围设备更快?
答案 0 :(得分:2)
在我看来,直接保留NSArray或NSDictionary中的CBPeripheral对象是最简单的方法。保留后,尽可能多次连接和断开连接(不扫描每次)到CBPeripheral。您唯一需要注意的是CBCentralManager的州。您将通过实现CBCentralManagerDelegate centralManagerDidUpdateState:方法来接收状态更改。如果状态更改为除CBCentralManagerStatePoweredOn之外的任何内容,则需要删除所有保留的CBPeripheral对象,并在状态重新开启后再执行一次扫描。
根据苹果文档:
如果状态移动到CBCentralManagerStatePoweredOff以下,则从此中央管理器获取的所有CBPeripheral对象都将变为无效,必须再次检索或发现。
但是,如果状态移动到CBCentralManagerStatePoweredOn以下,我建议无效/释放所有CBPeripheral对象。 CoreBluetooth是一个小马车并不是什么秘密,这似乎可以帮助我避免"无效的CBPeripheral"过去的警告。
如果您想在重置应用程序或关闭设备或甚至网络设置重置(缓存重置)后识别特定的CBPeripheral,那么您将需要一个唯一标识另一个不基于的设备的自定义实现CoreBluetooth免费为您提供的任何东西。
以下是我在其中一个应用中执行此操作的方法:
现在,每当centralManager发现CBPeripheral时,它都可以检查其本地UUID数据库,并毫无疑问地确定哪个设备与该CBPeripheral相关。
请参阅Paulw11关于如何在后台重新连接的答案。请注意,如果您的应用已被用户退出(在按两次主页按钮后刷新应用的预览),则任何长期"连接"即使应用程序重新启动,也会被取消。
答案 1 :(得分:0)
这取决于外设的类型和它实现的寻址方案。
使用Core Bluetooth作为外围设备运行的iOS设备将在几分钟内相当频繁地更改其地址。
对于其他外围设备,如健身监视器,HID设备等,地址永远不会改变(除非外围设备制造商也决定引入地址随机化)并且存储UUID字符串并尝试扫描是“安全的”在看到适当的UUID时直接重新连接 - 请注意,您不一定使用CBPeripheral
,但可以存储UUID对象。
您还可以使用后台模式自动重新启动应用并连接到外围设备。这种情况在Core Bluetooth programming guide的“锁定”示例中进行了描述。应用程序可以向外围设备发出“连接”,但不会超时。
总之,您不能真正存储基于iOS的外围设备的UUID,而是存储您可能的其他外围设备类型。