9

beh, ho un'applicazione che esegue la scansione e connettersi a un dispositivo 'bluetooth le' in iOS 6.0.1 ma su iphone 4s, e funziona bene. quando caricare l'applicazione al negozio Apple, che mi restituiscono un crash dell'applicazione, di programmazione pipistrello, ma capisco solo lo schianto quando provo l'applicazione su un iphone5 dove ilUuid CBperipheral è null in ios 6.0.1 su i-phone5

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

restituiscono un periferico con uuid nullo .

Stampo la periferica, il nome, l'uuid, l'rssi e l'advertData, tutto è buono ma l'uuid è nullo e utilizzo l'uuid nell'applicazione. questo fa in modo che la mia applicazione si blocchi, posso controllare l'uuid null, e questo significa che non posso controllare l'applicazione.

Qualcuno sa cosa succede e una possibile soluzione?

+0

soluzione porssible è il prossimo. – Manelonix

+0

Ho trovato la soluzione, chiedendo l'uuid dopo la lettura dei servizi. Solo quando la connessione è stata stabilita puoi sapere e consultare l'uuid del dispositivo ... a presto – Manelonix

+0

Ho un codice che usa questa chiamata indietro, quando viene eseguito su iPad, ottengo un non periferico.UUI, ma è null su iPhone 6.0.1 –

risposta

2

Quello che dobbiamo fare è il seguente: Non puoi scrivere l'oggetto periferico con un NSLog, ma non possiamo avere la proprietà uuid periferica prima che la connessione fosse eseguita. Era sempre nullo. Chiediamo l'uuid quando la lettura dei servizi è stata completata, non prima, e quindi non possiamo eseguire le applicazioni su i-phone5 senza crash.

Ho letto su TI (strumenti texas) che si trattava di un bug di iOS, ma per quanto mi riguarda è un aggiornamento di sicurezza, è necessario connettersi prima di chiedere l'uuid.

1

Dopo la prima connessione, l'UUID viene memorizzato/memorizzato nella cache dal dispositivo. Se la stessa periferica viene rilevata in un secondo momento, l'UUID sarà disponibile prima della connessione. È possibile chiedere tutte le periferiche memorizzate chiamando "retrievePeripherals".

0

Sembra essere un miglioramento di funzionalità/bug in iOS 6, che si rende più evidente su iPhone 5, a causa della natura asincrona del codice. Anch'io ho il codice che funziona sul 4S ma non sul 5.

La soluzione alternativa posta dalla maggior parte delle persone è assicurarsi di connetterti a tutti i dispositivi che trovi quando li trovi. La spiegazione è che l'UUID non viene assegnato fino a quando non viene stabilita una connessione.

Si può vedere un esempio di questo nel sensore di codice tag TI che è possibile scaricare dal sito di 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]; 

} 

Tuttavia è evidente che si può anche effettuare le seguenti operazioni

- (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]; 
    } 

} 

come didDiscoverPeripheral viene chiamato più di una volta per ogni dispositivo (lo vedo chiamato due volte su iPhone 5) e la seconda volta che i dettagli delle periferiche sono completi.

Problemi correlati