2012-11-01 11 views
9

scopro con successo un periferico e recuperare il suo nome locale:CoreBluetooth: aggiornamento di nome locale di un già scoperto periferico

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey] 

Ma se la periferica si arresta e si riavvia pubblicità con un nome locale diverso, il client non riconoscere il cambiamento. Immagino che

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral 

funziona solo se i due dispositivi sono accoppiati. C'è un modo per ottenere un aggiornamento senza abbinamento?

risposta

5

Bug di Apple. Ancora presente in iOS 6.1. Ecco come ripristinare la cache CB:

  1. Dispositivo di backup su iCloud.
  2. Ripristina le impostazioni di rete.
  3. Elimina la tua app e installala tramite Xode
  4. A questo punto, la tua periferica apparirà con il nuovo nome.
  5. Ripristina le impostazioni di rete manualmente o ripristina da iCloud.

Siamo spiacenti.

+5

oh boy oh boy .. l'API CoreBluetooth è così flakey .. (UUID nulli, i problemi di cache stupido .. arrrr) – mindbomb

+2

Purtroppo, ancora presente in iOS 8 :( – christophercotton

+0

Questo sta diventando ridicolo e davvero frustrante. – Bach

0

È possibile utilizzare KVO sulla proprietà name che funzionerà anche quando non è collegato, almeno in OS X 10.10. Lo uso solo per chiamare -peripheralDidUpdateName: metodo me stesso, e de-duplica le chiamate seguendo il nome della stringa.

self.name = self.peripheral.name; 
[self.peripheral addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"name"]) { 
     [self peripheralDidUpdateName:self.peripheral]; 
     return; 
    } 
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 


- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral { 
    if([peripheral.name isEqualToString:self.name]) return; 
    if([self.delegate respondsToSelector:@selector(peripheralDidUpdateName:)]) { 
     [self.delegate peripheralDidUpdateName:self]; 
    } 
} 
Problemi correlati