CBPeripheral存储的UUID有多长时间可用于重新连接?

时间:2014-08-05 03:57:46

标签: ios uuid core-bluetooth cbperipheral

我一直在玩Corebluetooth并且我已经了解到,除了每次想要连接时都经过繁琐的扫描外围设备的过程,我还可以存储外围设备的UUID并将其与retrievePeripheralsWithIdentifiers和connectPeripheral一起使用以进一步重新连接。

事实证明它只能运行一段时间,显然外围设备的UUID已更新,因此存储的可以被视为过期。

我无法在此找到任何一致的文档,因此我不确定它会持续多长时间。

有没有办法解决这个问题,以便以后重新连接比再次扫描外围设备更快?

2 个答案:

答案 0 :(得分:2)

在我看来,直接保留NSArray或NSDictionary中的CBPeripheral对象是最简单的方法。保留后,尽可能多次连接和断开连接(不扫描每次)到CBPeripheral。您唯一需要注意的是CBCentralManager的州。您将通过实现CBCentralManagerDelegate centralManagerDidUpdateState:方法来接收状态更改。如果状态更改为除CBCentralManagerStatePoweredOn之外的任何内容,则需要删除所有保留的CBPeripheral对象,并在状态重新开启后再执行一次扫描。

根据苹果文档:

  

如果状态移动到CBCentralManagerStatePoweredOff以下,则从此中央管理器获取的所有CBPeripheral对象都将变为无效,必须再次检索或发现。

但是,如果状态移动到CBCentralManagerStatePoweredOn以下,我建议无效/释放所有CBPeripheral对象。 CoreBluetooth是一个小马车并不是什么秘密,这似乎可以帮助我避免"无效的CBPeripheral"过去的警告。

如果您想在重置应用程序或关闭设备或甚至网络设置重置(缓存重置)后识别特定的CBPeripheral,那么您将需要一个唯一标识另一个不基于的设备的自定义实现CoreBluetooth免费为您提供的任何东西。

以下是我在其中一个应用中执行此操作的方法:

  1. 在第一次启动应用程序时Alloc / Init一个NSUUID对象,并将其作为NSString保存在NSUserDefaults中。将此UUID视为应用程序的伪MAC地址。此UUID将在应用程序的生命周期内保持不变。
  2. centralManager发现CBPeripheral,连接,然后读取特定特征的值
  3. CBPeripheral设备使用步骤1中与非蓝牙相关的UUID响应请求。我还在此步骤中包含了一大堆用户提供的信息以及UUID。
  4. centralManager使用Core Data或NSUserDefaults保存此UUID(以及您包含的任何其他信息),如果它还没有。
  5. 对所有新发现的CBPeripherals重复步骤2-4。
  6. 现在,每当centralManager发现CBPeripheral时,它都可以检查其本地UUID数据库,并毫无疑问地确定哪个设备与该CBPeripheral相关。

    请参阅Paulw11关于如何在后台重新连接的答案。请注意,如果您的应用已被用户退出(在按两次主页按钮后刷新应用的预览),则任何长期"连接"即使应用程序重新启动,也会被取消。

答案 1 :(得分:0)

这取决于外设的类型和它实现的寻址方案。

使用Core Bluetooth作为外围设备运行的iOS设备将在几分钟内相当频繁地更改其地址。

对于其他外围设备,如健身监视器,HID设备等,地址永远不会改变(除非外围设备制造商也决定引入地址随机化)并且存储UUID字符串并尝试扫描是“安全的”在看到适当的UUID时直接重新连接 - 请注意,您不一定使用CBPeripheral,但可以存储UUID对象。

您还可以使用后台模式自动重新启动应用并连接到外围设备。这种情况在Core Bluetooth programming guide的“锁定”示例中进行了描述。应用程序可以向外围设备发出“连接”,但不会超时。

总之,您不能真正存储基于iOS的外围设备的UUID,而是存储您可能的其他外围设备类型。