I successfully discover a Peripheral and retrieve its local name:
[advertisementData objectForKey:CBAdvertisementDataLocalNameKey]
But if the Peripheral stops and restarts advertising with a different local name, the Client doesn't recognise the change. I guess
- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral
only works if the two devices are paired. Is there a way to get an update without pairing?
Apple's bug. Still present in iOS 6.1. Here is the trick how to reset CB cache:
- BackUP device to iCloud.
- Reset network settings.
- Delete your app and install it back via Xode
- At this point, your peripheral will appear with the new name.
- Restore your network settings manually or restore from iCloud.
Sorry.
You can use KVO on the name property which will work even when not connected, at least this is the case in OS X 10.10. I just use this to call the -peripheralDidUpdateName: method myself, and de-dupe calls by tracking the name string.
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];
}
}
来源:https://stackoverflow.com/questions/13180134/corebluetooth-refreshing-local-name-of-an-already-discovered-peripheral