2012-11-01 10 views
9

pomyślnie odkryć peryferyjnych i odzyskać swoją nazwę lokalne:CoreBluetooth: odświeżanie lokalną nazwą już odkrył Peripheral

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey] 

Ale jeśli Peripheral zatrzymuje i restartuje reklamowe z inną nazwą lokalnego, klient nie rozpoznać zmianę. Domyślnie działa tylko wtedy, gdy oba urządzenia są sparowane. Domyślne ustawienie to

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral 

Czy istnieje sposób na aktualizację bez parowania?

Odpowiedz

5

Błąd Apple. Nadal obecny w iOS 6.1. Oto sztuczka, jak zresetować pamięć podręczną CB:

  1. Urządzenie do aktualizacji do iCloud.
  2. Zresetuj ustawienia sieciowe.
  3. Usuń aplikację i zainstaluj ją ponownie za pośrednictwem Xode
  4. W tym momencie urządzenie peryferyjne pojawi się z nową nazwą.
  5. Przywróć ustawienia sieciowe ręcznie lub przywróć z iCloud.

Przepraszamy.

+5

oh oh chłopiec chłopiec .. API CoreBluetooth jest tak flakey .. (null UUID, problemy cache głupi .. arrrr) – mindbomb

+2

Niestety, nadal obecne w systemów iOS 8 :( – christophercotton

+0

To się robi śmieszne i naprawdę frustrujące. – Bach

0

Możesz użyć KVO na własności nazwy, która zadziała, nawet jeśli nie jest połączona, przynajmniej tak jest w OS X 10.10. Po prostu używam tego, aby wywołać samą metodę -peripheralDidUpdateName: i anulować połączenia, śledząc ciąg znaków.

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]; 
    } 
} 
Powiązane problemy