2012-11-01 2 views
9

je découvre avec succès un périphérique et de récupérer son nom local:CoreBluetooth: Rafraîchissant nom local d'un périphérique déjà découvert

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey] 

Mais si le périphérique arrête et redémarre la publicité avec un nom local différent, le client n'a pas reconnaître le changement. Je suppose que

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral 

ne fonctionne que si les deux périphériques sont jumelés. Y at-il un moyen d'obtenir une mise à jour sans appariement?

Répondre

5

Le bug d'Apple. Toujours présent dans iOS 6.1. Voici l'astuce pour réinitialiser le cache CB:

  1. Dispositif BackUP pour iCloud.
  2. Réinitialiser les paramètres réseau.
  3. Supprimez votre application et réinstallez-la via Xode
  4. À ce stade, votre périphérique apparaîtra avec le nouveau nom.
  5. Restaurez manuellement vos paramètres réseau ou restaurez à partir d'iCloud.

Désolé.

+5

oh boy oh boy .. l'API CoreBluetooth est si flakey .. (UUID null, les problèmes de cache stupide .. arrrr) – mindbomb

+2

Malheureusement, encore présent dans iOS8 :( – christophercotton

+0

Cela devient ridicule et vraiment frustrant. – Bach

0

Vous pouvez utiliser KVO sur la propriété name qui fonctionnera même s'il n'est pas connecté, du moins c'est le cas dans OS X 10.10. Je l'utilise simplement pour appeler moi-même la méthode -peripheralDidUpdateName: et dé-duper les appels en suivant la chaîne de nom.

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]; 
    } 
} 
Questions connexes