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

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

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

我还没有找到任何关于此的一致文档,所以我不确定它持续多久。

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

在我看来,直接保存在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。

现在,每当centralManager发现CBPeripheral时,它都可以检查其本地UUID数据库,并毫无疑问地确定哪个设备与该CBPeripheral相关。

请参阅Paulw11关于如何在后台重新连接的答案。 请注意,如果您的应用已被用户退出(按两次主页按钮后轻扫应用的预览),即使应用重新启动,任何长期“连接”都将被取消。

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

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

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

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

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