在我看来,直接持有 NSArray 或 NSDictionary 中的 CBPeripheral 对象是最简单的方法。保留 CBPeripheral 后,可根据需要多次连接和断开连接(无需每次都扫描)。您唯一需要注意的是 CBCentralManager 的状态。您将通过实现 CBCentralManagerDelegate centralManagerDidUpdateState: 方法来接收状态更改。如果状态更改为除 CBCentralManagerStatePoweredOn 之外的任何内容,那么您需要删除所有保留的 CBPeripheral 对象,并在状态重新打开后进行另一次扫描。
根据苹果文档:
如果状态低于 CBCentralManagerStatePoweredOff,则从该中央管理器获得的所有 CBPeripheral 对象都将变为无效,必须重新检索或发现。
但是,如果状态低于 CBCentralManagerStatePoweredOn,我建议您使所有 CBPeripheral 对象无效/释放。CoreBluetooth 有点小问题已经不是什么秘密了,这似乎帮助我避免了过去的“无效 CBPeripheral”警告。
如果您想在应用程序重置或设备关闭甚至网络设置重置(缓存重置)后识别特定的 CBPeripheral,那么您将需要有一个自定义实现来唯一标识另一个设备,而不是基于任何 CoreBluetooth 提供你是免费的。
以下是我在我的一个应用程序中的操作方式:
- 首次启动应用程序时分配/初始化一个 NSUUID 对象,并将其作为 NSString 保存在 NSUserDefaults 中。将此 UUID 视为您的应用程序的伪 MAC 地址。此 UUID 将在应用程序的整个生命周期内保持不变。
- centralManager 发现一个 CBPeripheral,连接,然后读取特定特征的值
- CBPeripheral 设备使用步骤 1 中的非蓝牙相关 UUID 响应请求。我还在此步骤中包含一大堆用户提供的信息以及 UUID。
- 如果尚未使用 Core Data 或 NSUserDefaults,centralManager 会保存此 UUID(以及您包含的任何其他信息)。
- 对所有新发现的 CBPeripheral 重复步骤 2-4。
现在,每当 centralManager 发现一个 CBPeripheral 时,它就可以检查其本地 UUID 数据库,并毫无疑问地确定哪个设备与该 CBPeripheral 相关。
有关如何在后台重新连接,请参阅 Paulw11 的答案。请注意,如果您的应用程序已被用户退出(按两次主页按钮后向上滑动应用程序的预览),即使应用程序重新启动,任何长期“连接”都将被取消。