flutter_blue 0.8.0在macOS 11.6调用discoverServices获取蓝牙服务报错
问题根因分析
1. flutter_blue 0.8.0 macOS端原生实现缺陷
flutter_blue 0.8.0对macOS平台的支持处于实验阶段,原生层对接CoreBluetooth框架时,未对返回的服务、特征UUID做非空校验。当CoreBluetooth识别到设备返回的UUID不符合预期时,会直接将空字符串传递到Dart层,触发Guid解析逻辑的格式异常。
2. 跨平台蓝牙栈的UUID处理逻辑差异
iOS、Android系统的蓝牙栈会自动将设备返回的16位/32位短UUID补全为标准128位UUID后再传递给上层,因此移动端可以正常发现服务。而macOS 11.6的CoreBluetooth框架不会对自定义格式的短UUID做自动补全,甚至会将不符合苹果校验规则的UUID直接返回为空对象,flutter_blue未兼容该场景。
3. 异常触发逻辑匹配
你提供的日志中uuid: xxxxxx-23e0-4bdc-ac16-xxxxxxxx value: (null)已经验证了该问题:原生层已识别到服务UUID,但在返回对应特征的UUID时出现空值,空字符串传入_fromString方法后,经过_removeNonHexCharacters处理后长度为0,不满足16字节的标准UUID要求,直接抛出FormatException。
可行修复方案
- 本地修改flutter_blue依赖的
guid.dart文件,在_fromString方法入口增加空字符串判断,对于无效UUID可选择跳过解析、或者填充默认占位值,避免异常抛出中断整个服务发现流程。 - 替换依赖为社区维护的
flutter_blue_plus分支,该分支已修复macOS端UUID空值校验、短UUID补全的相关问题,对macOS平台的兼容性远高于原版0.8.0版本。 - 若需继续使用原版flutter_blue 0.8.0,可修改macOS端插件的原生代码,在将UUID传递给Dart层前增加非空校验和短UUID补全逻辑,过滤无效的空UUID上报。
内容的提问来源于stack exchange,提问作者Radiance
相关产品推荐
相关产品推荐

