最佳实践
重新链接Peripheral
使用 Core Bluetooth 框架,有三种方式来重新连接 peripheral 设备:
- 使用
retrievePeripheralsWithIdentifiers:
方法获取已知 peripheral 设备的列表,这些设备是我们已经搜索并连接过的设备。如果我们查找的 peripheral 在列表中,则尝试重新连接。
// connectedPeripheralId 为 peripheral.identifier
NSArray<CBPeripheral *> *knownPeripherals = [self.centralManager retrievePeripheralsWithIdentifiers:@[self.connectedPeripheralId]];
if (knownPeripherals.count == 0) {
return;
}
self.peripheral = knownPeripherals[0];
self.peripheral.delegate = self;
[self.centralManager connectPeripheral:self.peripheral
options:@{CBConnectPeripheralOptionNotifyOnDisconnectionKey: [NSNumber numberWithBool:YES]}];
- 使用
retrieveConnectedPeripheralsWithServices:
方法获取当前连接到系统的 peripheral 设备的列表(如被其它程序连接着)。如果我们查找的 peripheral 设备在列表中,则连接它。 - 使用
scanForPeripheralsWithServices:options:
方法扫描并搜索 peripheral 设备。如果找到,则连接它。
问题与验证
- 是否可以通过:检测蓝牙连接或者蓝牙是否断开,来判定蓝牙笔是否仍然连接
解答:当蓝牙从控制中心关闭时,此时 delegate 收到更新,蓝牙 poweredOff;此时CBCentralmanager
检测到的设备列表为空 - 是否可以通过:注册通知时,name 字段设为 nil,来接收所有的通知,观察是否有蓝牙断开、连接的系统通知,以及是否有 Apple Pencil 连接断开的通知
解答:蓝牙连接与断开时系统未发通知, Apple Pencil 连接与断开时,系统也未发通知 - 在创建iOS 蓝牙demo工程,iPhone作为无法发现周边广播的蓝牙设备
解答:将scanForPeripheralsWithServices: options:
函数放到delegateCBCentralManagerDelegate
函数centralManagerDidUpdateState:(CBCentralManager *)central
中即可解决问题