Метод делегата CBCentralManger ведет себя по-разному в iOS 11 и ниже iOS 11, когда состояние центрального менеджера CBManagerStatePoweredOff

Метод делегата CBCentralManger ведет себя по-разному в iOS 11 и ниже iOS 11

Ниже iOS 11: после обновления состояния CBCentralMangaer до CBManagerStatePoweredOff состояние делегата CentralManager - (void) centralManager: (CBCentralManager *) central didDisconnectPeripheral: (CBPeripheral *) периферийная ошибка : (NSError *) ошибка и подключенное периферийное устройство будет отключено.

iOS 11. После обновления состояния CBCentralMangaer до состояния CBManagerStatePoweredOff центральный менеджер отключил делегат, didDisconnectPeripheral не вызывает.

Я хочу, чтобы делегат отключения был вызван в iOS 11, так как я могу решить эту проблему в iOS 11.


person Community    schedule 16.10.2018    source источник
comment
Вы сказали, что в iOS 11 вызывается метод делегата , что вам и нужно. Тем не менее, вы не можете изменить поведение Core Bluetooth, особенно в старой версии iOS, которая больше не будет получать обновления.   -  person Paulw11    schedule 16.10.2018
comment
@ Paulw11 Спасибо за улов. Вопрос обновлен, пожалуйста, проверьте его сейчас.   -  person    schedule 16.10.2018
comment
Как в этом случае выключить Bluetooth? Вы используете прокручиваемое вверх / вниз меню или приложение "Настройки"?   -  person Markus Rautopuro    schedule 03.01.2019


Ответы (1)


Вы правы, что поведение API изменилось между iOS 10 и iOS 11 в отношении изменений состояния Bluetooth. К сожалению, вы ничего не можете сделать, чтобы это изменить.

Однако лучший способ обойти это - добавить собственную логику в обратный вызов centralManagerDidUpdateState:. Здесь вы можете проверить, является ли новое состояние CBManagerStatePoweredOff, и вы используете iOS 11 или выше. Если это так, просто сделайте все, что вам нужно, обновите пользовательский интерфейс или что-то подобное.

- (void)centralManagerDidUpdateState:(CBCentralManager *)central;
{
    if (central.state == CBManagerStatePoweredOff && @available(iOS 11, *)) 
    {
        // Do the same stuff that you would do in didDisconnectPeripheral: on iOS 10.
    }
}
person Anton    schedule 16.10.2018
comment
Да, этот подход сработал. Спасибо за ваш ответ - person ; 30.10.2018