didDisconnectPeripheral: не вызывается
У меня есть пользовательский объект BLEDevice
который имеет слабую ссылку на CBPeripheral
объект. Я поддерживаю словарь, в котором хранятся связи между периферийными устройствами и моими пользовательскими объектами:
- (void)setDeviceForPeripheral:(CBPeripheral *)peripheral {
// New device: sets a new 'BLEDevice' instance
BLEDevice *new = [[BLEDevice alloc] initWithPeripheral:peripheral];
new.name = peripheral.name;
new.peripheral.delegate = self;
[associations setObject:new forKey:peripheral];
}
Когда я обнаруживаю новое периферийное устройство в ближайшем окружении, я выполняю следующие операции:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
if (![associations objectForKey:peripheral]) {
NSLog(@"Found peripheral: %@", peripheral.name);
[self setDeviceForPeripheral:peripheral];
[[NSNotificationCenter defaultCenter] postNotificationName:@"BLEDeviceFound" object:nil];
}
}
На этом этапе я определяю собственный метод подключения к моему устройству:
- (void)connect:(BLEDevice *)device {
// Connects with the peripheral
[manager connectPeripheral:device.peripheral options:nil];
}
Здесь все работает просто отлично: мое периферийное устройство подключается, и я начинаю выполнять операции со службами и характеристиками внутри метода делегата centralManager:didConnectPeripheral:
,
Теперь мои проблемы приходят. Когда я хочу отключиться от моего периферийного устройства, я выполняю следующие операции:
- (void)disconnect:(BLEDevice *)device {
// Unsubscribes from all the characteristics in services
for (CBService *service in device.peripheral.services) {
for (CBCharacteristic *characteristic in service.characteristics)
[device.peripheral setNotifyValue:NO forCharacteristic:characteristic];
}
[manager cancelPeripheralConnection:device.peripheral];
}
Когда я вызываю этот метод, мое периферийное устройство подтверждает, что отключение прошло успешно. Во всяком случае, метод делегата centralManager:didDisconnectPeripheral:
не вызывается. Может кто-нибудь объяснить, пожалуйста, почему?
2 ответа
Метод не вызывается при отключении периферийных устройств, как следует из названия. То, что вы хотите, это следующее.
- centralManager:didDisconnectPeripheral:error:
В документе говорится:
Вызывается, когда разорвано существующее соединение с периферийным устройством.
Метод делегата будет вызываться при отключении периферийных устройств.
Я обнаружил, что решение действительно простое. Я просто вызвал неправильный метод делегата. Правильная подпись
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error.
Это дерьмо сводит меня с ума с неделями!