CBperipheral uuid является нулевым в ios 6.0.1 на i-phone5

Ну, у меня есть приложение, которое сканирует и подключается к устройству "bluetooth le" под ios 6.0.1, но на iphone 4s, и оно работает хорошо. при загрузке приложения в Apple Store они возвращают мне сбой приложения, программирование на bat, но сбой я понимаю только тогда, когда пробую приложение на iphone5, где

 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; 

верните мне периферию с нулевым UUID.

Я печатаю периферию, имя, uuid, rssi и advertData, все хорошо, но uuid нулевой, и я использую uuid в приложении. это приводит к сбою приложения, я могу управлять нулевым UUID, а это значит, что я не могу контролировать приложение.

Кто-нибудь знает, что происходит, и возможное решение?

3 ответа

Нам нужно сделать следующее: вы не можете написать периферийный объект с помощью NSLog, но у нас не может быть свойства периферийного uuid до того, как будет выполнено соединение. Это всегда было нулевым. Мы запрашиваем uuid, когда чтение сервисов было завершено, а не раньше, и тогда мы не можем запускать приложения на i-phone5 без сбоев.

На TI (Texas Instruments) я читал о том, что это ошибка ios, но я считаю, что это серьезное обновление безопасности, нам нужно подключиться, прежде чем запрашивать uuid.

После первого подключения UUID запоминается / кэшируется устройством. Если такое же периферийное устройство будет обнаружено позднее, UUID будет доступен до подключения. Вы можете запросить все запомненные периферийные устройства, вызвав "retrievePeripherals".

Похоже, что в iOS 6 появилось исправление ошибок / функций, которое стало более очевидным на iPhone 5, я думаю, из-за асинхронного характера кода. У меня тоже есть код, который работает на 4S, но не на 5.

Обходной путь, размещенный большинством людей, должен удостовериться, что Вы подключаетесь к каждому устройству, которое Вы находите, поскольку Вы находите это. Объяснение заключается в том, что UUID не назначается до тех пор, пока не будет установлено соединение.

Вы можете увидеть пример этого в коде тега датчика TI, который вы можете загрузить с сайта TI

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

    NSLog(@"Found a BLE Device : %@",peripheral);

    /* iOS 6.0 bug workaround : connect to device before displaying UUID !
       The reason for this is that the CFUUID .UUID property of CBPeripheral
       here is null the first time an unkown (never connected before in any app)
       peripheral is connected. So therefore we connect to all peripherals we find.
    */

    peripheral.delegate = self;
    [central connectPeripheral:peripheral options:nil];

    [self.nDevices addObject:peripheral];

}

Однако заметно, что вы также можете сделать следующее

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"didDiscoverPeripheral");

    if (![foundPeripherals containsObject:peripheral]) {
        NSLog(@"foundPeripherals addObject %@", peripheral.name);
        [foundPeripherals addObject:peripheral];
    } else {
        NSInteger index = [foundPeripherals indexOfObject:peripheral];
        NSLog(@"foundPeripherals replaceObject %@", peripheral.name);
        [foundPeripherals replaceObjectAtIndex:index withObject:peripheral];
    }

}

как didDiscoverPeripheral вызывается более одного раза для каждого устройства (я вижу, что он вызывается дважды на iPhone 5), а во второй раз детали периферийных устройств завершены.

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