清除iOS BLE缓存

8

我当前使用的是iOS 7。在扫描时检索到的BLE外设名称似乎是基于地址进行缓存的。即使将BLE设备名称刷新为新值,在iOS 7的外设发现 [myCentralManager scanForPeripheralsWithServices:nil options:nil];期间,我仍然会得到旧的设备名称。

  1. 有没有编程方式清除BLE设备缓存?
  2. 即使手动刷新,也似乎不可能。在“设置”->“蓝牙”下,BLE设备似乎从未列出,尽管可以通过编程方式扫描和连接。(按照这里的说明here)为什么会这样?

@Kai 没有运气。我似乎总是得到相同的旧结果,而且我还没有找到解决办法。 - huggie
顺便说一句,这似乎取决于BLE芯片。有些芯片似乎没有相同的问题。 - huggie
@Kai TI 2650似乎工作正常。您的体验可能会有所不同,请勿过分依赖。 - huggie
1
手动关闭蓝牙为我清除了缓存。我推测,以编程方式打开和关闭蓝牙可能也能解决问题,尽管这并不是最好的用户体验。 - c.fogelklou
显示剩余4条评论
1个回答

6
我建议采用最有效且暴力的方法,而我的方法奏效了!!!
重置你的iPhone:
设置 --> 通用 --> 恢复 --> 删除所有内容和设置
然后再次扫描。它奏效了。
另一种方法:
现在让我告诉你正确的解决问题的方式:
需要考虑两个名称:广告名称和GAP(通用接入配置文件)名称。
对于iOS从未连接过的外围设备,“名称”属性所报告的是广告名称。一旦连接,GAP名称被缓存,并作为外围设备的名称报告。由于广告名称存在尺寸限制,因此认为GAP名称是更好的名称。
没有规则说两个名称必须匹配。这取决于您的用例和实施方式。有些人会将GAP名称视为固定名称,但广告名称更像是“别名”,因为可以很容易地更改它。
如果要使两个名称同步,您还应该更改广告名称以及GAP名称。如果正确实现,您的CB管理器委托将收到调用peripheralDidUpdateName:
如果要手动清除缓存,则需要重置iOS设备。
链接(https://forums.developer.apple.com/thread/19381
事实上,此方法(peripheralDidUpdateName)并未被调用。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {

    NSString * gapName = peripheral.name;
    NSString * identityName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];
}

使用[advertisementData objectForKey:CBAdvertisementDataLocalNameKey]获取外围设备名称比peripheral.name更加精确,因为peripheral.name获取GAP名称,而[advertisementData objectForKey:CBAdvertisementDataLocalNameKey]获取的是更新后的名称。

这里是截图


1
CSS v7§1.2.1:“本地名称数据类型应与分配给设备的本地名称相同或缩短版本。[...]如果名称被缩短,则可以通过BR / EDR上的远程名称请求过程或在使用GATT建立连接后读取设备名称特征来读取完整名称。 缩短名称只能包含从完整名称开头开始的连续字符。例如,如果设备名称为“BT_Device_Name”,则缩短名称可以是“BT_Device”或“BT_Dev”。 - T'n'E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接