CBPeripheral 存储的 UUID 对于重新连接有效多长时间? [复制]

2024-01-18

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

事实证明,它只能工作一段时间,显然外设的 UUID 已更新,因此可以认为存储的 UUID 已过期。

我无法找到任何相关的文档,所以我不确定它能持续多久。

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


在我看来,直接持有 NSArray 或 NSDictionary 中的 CBPeripheral 对象是最简单的方法。一旦保留 CBPeripheral,您可以根据需要多次连接和断开连接(无需每次扫描)。您唯一需要注意的是 CBCentralManager 的状态。您将通过实现 CBCentralManagerDelegatecentralManagerDidUpdateState: 方法来接收状态更改。如果状态更改为除 CBCentralManagerStatePoweredOn 之外的任何状态,那么您需要删除所有保留的 CBPeripheral 对象,并在状态重新打开后进行另一次扫描。

根据苹果文档:

如果状态低于 CBCentralManagerStatePoweredOff,则从该中央管理器获取的所有 CBPeripheral 对象都将变为无效,并且必须重新检索或发现。

但是,如果状态低于 CBCentralManagerStatePoweredOn,我建议使所有 CBPeripheral 对象失效/释放。众所周知,CoreBluetooth 存在一些问题,这似乎帮助我避免了过去的“无效 CBPeripheral”警告。

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

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

  1. 第一次启动应用程序时分配/初始化一个 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 的答案。请注意,如果您的应用程序已被用户退出(按两次主页按钮后向上滑动应用程序的预览),则即使重新启动应用程序,任何长期“连接”也将被取消。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CBPeripheral 存储的 UUID 对于重新连接有效多长时间? [复制] 的相关文章

随机推荐