清除CoreBluetooth GATT缓存而不删除绑定。

3
我有一个iOS应用程序作为外设,和一个OS X应用程序作为中心,使用CoreBluetooth框架。OS X应用程序连接到iOS应用程序并通过读取加密特征和输入随机代码来进行绑定。一切都运行良好,直到iOS应用程序重新启动。从那时起,每次我连接到iOS设备并尝试读取其任何特征时,它都会返回“句柄无效”错误。修复此问题的唯一方法是从OS X的蓝牙首选项中删除设备并重新启动绑定过程。
我怀疑这个问题是由于OS X缓存了我的设备的服务和特征,因为当我在重启一个iOS设备后使用两个iOS设备相互连接时,问题不会出现。
我正在寻找的是清除OS X缓存我的服务和特征的方法。我熟悉删除com.apple.Bluetooth.plist并重新启动blued进程/打开关闭蓝牙的方法。(blued是否缓存ATT值,如何清除缓存?如何在MacOS上清除CoreBluetooth缓存?
然而,删除com.apple.Bluetooth.plist需要我再次与iOS设备进行绑定并输入代码。有没有办法只清除与我的应用程序相关的服务/特征的缓存?

基本问题,但让我们从这里开始:连接成功后,您是否重新发现所有内容? - allprog
@allprog 是的,我重新发现了我的应用程序所需的服务和特性。 - Joost
1个回答

8

事实证明这比我想象的要容易。在com.apple.Bluetooth.plist文件中,有一个CoreBluetoothCache键,其中包含一些缓存的服务和其他内容的字典。棘手的部分是在没有blued覆盖所有内容的情况下编辑缓存。无论如何,以下是正确的方法(在终端中执行):

sudo defaults write /Library/Preferences/com.apple.Bluetooth CoreBluetoothCache -dict
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.blued.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.blued.plist

此后,CoreBluetooth实际上重新发现了服务并以正确的方式读取了特征。


给未来的读者:这不会断开蓝牙鼠标或键盘,所以不用担心。 - Andrew

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