CoreBluetooth: Refreshing local name of an already

2020-07-06 01:41发布

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?

2条回答
▲ chillily
2楼-- · 2020-07-06 02:11

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];
    }
}
查看更多
我只想做你的唯一
3楼-- · 2020-07-06 02:35

Apple's bug. Still present in iOS 6.1. Here is the trick how to reset CB cache:

  1. BackUP device to iCloud.
  2. Reset network settings.
  3. Delete your app and install it back via Xode
  4. At this point, your peripheral will appear with the new name.
  5. Restore your network settings manually or restore from iCloud.

Sorry.

查看更多
登录 后发表回答