【问题标题】:CoreBluetooth: Refreshing local name of an already discovered PeripheralCoreBluetooth:刷新已发现外设的本地名称
【发布时间】:2012-10-22 05:18:11
【问题描述】:

我成功发现了一个外设并检索了它的本地名称:

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey]

但是,如果外设停止并使用不同的本地名称重新启动广告,则客户端无法识别更改。我猜

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral

仅当两个设备配对时才有效。有没有办法在不配对的情况下获得更新?

【问题讨论】:

    标签: ios bluetooth core-bluetooth cbperipheral


    【解决方案1】:

    苹果的错误。仍然存在于 iOS 6.1 中。以下是重置 CB 缓存的技巧:

    1. 备份设备到 iCloud。
    2. 重置网络设置。
    3. 删除您的应用并通过 Xode 重新安装
    4. 此时,您的外围设备将以新名称出现。
    5. 手动恢复您的网络设置或从 iCloud 恢复。

    对不起。

    【讨论】:

    • 天哪,天哪……CoreBluetooth API 太脆弱了……(空 UUID,愚蠢的缓存问题……arrrr)
    • 遗憾的是,iOS8 中仍然存在 :(
    • 这太荒谬了,真的很令人沮丧。
    • 这个答案 stackoverflow.com/a/25930825/886839 表明 Apple 不认为这是一个错误。
    • 仍然存在于 IOS 12 中。
    【解决方案2】:

    您可以在 name 属性上使用 KVO,即使在未连接时也可以使用,至少在 OS X 10.10 中是这种情况。我只是使用它自己调用 -peripheralDidUpdateName: 方法,并通过跟踪名称字符串来重复调用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2018-02-05
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多