2

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

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

我无法找到任何一致的文档,所以我不确定它会持续多久。

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

4

1 回答 1

2

在我看来,直接持有 NSArray 或 NSDictionary 中的 CBPeripheral 对象是最简单的方法。保留 CBPeripheral 后,可根据需要多次连接和断开连接(无需每次都扫描)。您唯一需要注意的是 CBCentralManager 的状态。您将通过实现 CBCentralManagerDelegate centralManagerDidUpdateState: 方法来接收状态更改。如果状态更改为除 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. 如果尚未使用 Core Data 或 NSUserDefaults,centralManager 会保存此 UUID(以及您包含的任何其他信息)。
  5. 对所有新发现的 CBPeripheral 重复步骤 2-4。

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

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

于 2014-08-05T04:06:40.543 回答