CBperipheral uuid равен нулю в ios 6.0.1 на i-phone5

ну, у меня есть приложение, которое сканирует и подключается к устройству «Bluetooth le» под ios 6.0.1, но на iphone 4s, и оно работает хорошо. при загрузке приложения в apple store мне возвращают краш приложения, bat программирование, но я понимаю краш только когда пробую приложение на айфон5 где

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

верните мне периферийное устройство с нулевым uuid.

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

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


person Manelonix    schedule 04.12.2012    source источник
comment
возможное решение следующее.   -  person Manelonix    schedule 05.12.2012
comment
Я нашел решение, спросив uuid после того, как услуги были прочитаны. Только когда соединение будет установлено, вы сможете узнать и проконсультироваться с uuid устройства... скоро увидимся   -  person Manelonix    schedule 10.12.2012
comment
У меня есть код, который использует этот обратный вызов, при запуске на iPad я получаю non bil periferial.UUI, но на iPhone 6.0.1 он нулевой.   -  person Max L.    schedule 03.05.2013


Ответы (3)


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

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

person Manelonix    schedule 10.12.2012

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

person shusson    schedule 19.12.2012

Похоже, это ошибка/улучшение функции в 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), и во второй раз детали периферийных устройств полны.

person Longmang    schedule 03.06.2013