2014-09-26 19 views
8

Ho riscontrato un problema dall'aggiornamento di iOS 8, in questo momento la mia app è collegata a un dispositivo BLE e legge periodicamente l'RSSI grazie a un timer e al metodo ReadRSSI.ReadRSSI non chiama il metodo delegato

Il metodo readRSSI viene chiamato (controllato con un punto di interruzione), quindi fino a questo punto tutto va bene.

Secondo la documentazione chiamando il readRSSI dovrebbe far scattare il callback

- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error 

Tuttavia, questo metodo delegato non viene chiamato ogni volta. Ma quando accendo e spengo il bluetooth del telefono, torno gli aggiornamenti RSSI. Qualcuno ha già riscontrato questo problema? Come posso risolverlo?

+0

Provare a connettersi alle periferiche per [risposta a una domanda simile] (http://stackoverflow.com/a/27030526/4272525). –

+0

Ho dovuto resettare il mio iPhone per farlo funzionare di nuovo, tenendo premuto i pulsanti di accensione e Home. – marcelosalloum

risposta

4

Ho avuto lo stesso problema, prima ho pensato che potesse essere colpa mia, ma in seguito si è rivelato davvero strano.

Ho scritto un programma simile, utilizzando iPhone per connettersi a un beacon BLE e utilizzare [CBPeripheral readRSSI] per ottenere la potenza del segnale. Tutto diventa fluido quando il beacon BLE è collegato al mio iPhone per la prima volta. Ma se viene disconnesso e riconnesso di nuovo, il metodo readRSSI non verrà più chiamato. Solo dopo aver riavviato il bluetooth sul mio iPhone, il problema sarà risolto.

Eseguo il programma in modalità di debug, passo dopo passo, con mia sorpresa, non ho riscontrato alcun problema. Anche se mi disconnetto per così tante volte e riconnesso di nuovo, il metodo readRSSI può ancora essere chiamato correttamente.

Spero che questo possa essere d'aiuto. Sto anche aspettando una risposta per questa strana cosa.

+0

Grazie per la tua risposta, ho appena riempito un bug report di Apple, ti terrò aggiornato –

+0

Quindi Apple ha appena chiuso il mio Bug come duplicato di # 18476971 ma non riesco ad accedervi quindi non ho idea dell'indagine di Apple –

+0

Penso che abbiano già realizzato il problema, sembra che il BLE stia avendo molti problemi in iOS8. –

1

Ho 8.0, funziona correttamente.

Poiché sopra è deprecato in iOS 8, provare l'altro delegato, segnalerà.

-(void) peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error { 
    NSLog(@"Got RSSI update in didReadRSSI : %4.1f", [RSSI doubleValue]); 
} 

Questo sembra essere un metodo delegato OSX. Apple probabilmente aggiungerà presto qualcosa su iOS per RSSI.

In iOS 8.0 didReadRSSI funziona. Nella documentazione 8.0.2 non è elencato sotto iOS.

Se metto entrambi i metodi didReadRSSI viene chiamato in iOS 8 & peripheralDidUpdateRSSI viene chiamato in iOS 7.

Quindi non aggiornare a iOS 8.0.2 fino Mele mette qualcosa per RSSI.

Qualcuno ha provato iOS 8.1 beta?

Sembra che durante la scansione dei dispositivi non sia possibile leggere l'RSSI. Se la chiamata a [CBCentralManager scanForPeripheralsWithServices ...] è stata avviata, non si verifica alcun effetto di ReadRSSI (nessun delegato viene chiamato). Ma se viene emesso [CBCentralManager stopScan], ReadRSSI inizia a rispondere.

Da notare anche: il dispositivo deve essere in stato di connessione per impartire comandi altrimenti si otterrà: CoreBluetooth [API IMPROPRIO] CBPeripheral può accettare solo i comandi, mentre nello stato connesso.

2

Recentemente mi sono imbattuto in questo problema e ho avuto più problemi che lo causavano.Ecco le soluzioni in modo lista di controllo, dal più semplice al più complesso:

  1. Il CBCentralManager non terrà un forte riferimento alla peripheral, è necessario mantenere da soli.
  2. Assicurati di essere lo peripheral.delegate.
  3. Assicurati di implementare il nuovo metodo peripheral(peripheral:didReadRSSI:error:) e non quello precedente.
  4. iOS 8.0.2 ha introdotto problemi con il metodo precedente, qualsiasi versione successiva a quella 8.1, 8.2, 8.3, funziona senza problemi (cosa stava citando @ Gamma-Point).
  5. Si può solo readRSSI per i dispositivi che sono collegati al centro, in modo da:
    1. Per i dispositivi che recuperati dal ritrovamento, è possibile passare [CBCentralManagerScanOptionAllowDuplicatesKey : true] quando si fa scanForPeripheralsWithServices(_:options:). Come visto in this answer.
    2. Inoltre, c'è un trucco con il metodo central.retrieveConnectedPeripheralsWithServices. questo metodo restituisce dispositivi "connessi", ma il servizio readRSSI non funziona fino a quando non si chiama effettivamente connectPeripheral(_:options:), quindi anche se sono collegati a iPhone/iPad/AppleWatch, non sono collegati a il tuo centrale, molto fastidioso.

Quest'ultima è stata la grande Gotcha per me, speravo di "raccogliere il più vicino" dispositivo collegato o scoperto, ma non riusciva a tenere il RSSI aggiornato su di loro. La documentazione non dice nulla neanche.

Quello che ho finito per fare è stato costruire un grande dizionario con tutti i dispositivi indicizzati da [UUID : Device] (il dispositivo è un wrapper per lo CBPeripheral). I dispositivi aggiunti tramite discovery ottengono il loro RSSI aggiornato tramite il metodo de discover e quelli connessi tramite un timer GCD sulla coda Bluetooth che chiama readRSSI e aggiorna la propria lettura RSSI.

Problemi correlati