iOS8 и BTLE | CBCentralManager не может найти периферийные устройства

У меня есть приложение для iOS, которое подключается к устройству (Arduino) с помощью BTLE. На моем iPad iOS 7 все работает нормально. После обновления до iOS 8 CBCentralManager не находит никаких периферийных устройств.

- (void)startScanningForSupportedUUIDs
{
   [self.centralManager scanForPeripheralsWithServices:nil options:nil];

}

Я не знаю, в чем может быть проблема.

2 ответа

Решение

У меня есть решение, по какой-то причине в iOS 8 есть некоторая задержка после создания экземпляра вашего CBManager. Вам нужно начать сканирование, когда CBCentralManager включен, в этом методе:

-(void)centralManagerDidUpdateState:(CBCentralManager *)central{
switch (central.state) {
    case CBCentralManagerStatePoweredOff:
        NSLog(@"CoreBluetooth BLE hardware is powered off");
        break;
    case CBCentralManagerStatePoweredOn:
    {
        NSLog(@"CoreBluetooth BLE hardware is powered on and ready");
        NSArray         *uuidArray  = [NSArray arrayWithObjects:[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID], nil];
        NSDictionary    *options    = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
        [centralManager scanForPeripheralsWithServices:uuidArray options:options];
    }
        break;
    case CBCentralManagerStateResetting:
        NSLog(@"CoreBluetooth BLE hardware is resetting");
        break;
    case CBCentralManagerStateUnauthorized:
        NSLog(@"CoreBluetooth BLE state is unauthorized");
        break;
    case CBCentralManagerStateUnknown:
        NSLog(@"CoreBluetooth BLE state is unknown");
        break;
    case CBCentralManagerStateUnsupported:
        NSLog(@"CoreBluetooth BLE hardware is unsupported on this platform");
        break;
    default:
        break;
}

В IOS 7 вы можете уйти, запустив сканирование BLE еще до того, как CBCentralManager будет готов. IOS 7 выкладывал предупреждение в таких случаях -

CoreBluetooth [API MISUSE] может принимать команды только во включенном состоянии

С IOS8 - предупреждение больше не появляется и сканирование фактически не начинается. Чтобы решить эту проблему, дождитесь включения CBCentral, то есть дождитесь, пока диспетчер CBCentral перейдет в состояние "CBCentralManagerStatePoweredOn", а затем запустите сканирование. Это прекрасно работает с этим изменением:)

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