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.

Это дерьмо сводит меня с ума с неделями!

Другие вопросы по тегам