1. 问题现象与背景分析
最近在开发一个基于uni-app的跨平台BLE(低功耗蓝牙)应用时,遇到了一个典型的多平台兼容性问题:在微信小程序环境下,BLE设备的读写和监听功能完全正常,但当我们将应用编译为安卓原生APP后,虽然读写操作仍然可以执行,但监听功能却完全失效了。这个问题困扰了我们团队整整两周时间,经过深入排查和反复测试,终于找到了根本原因和解决方案。
1.1 现象具体描述
在微信小程序环境中,我们使用uni-app的BLE API能够:
- 成功发现并连接BLE设备
- 正常写入特征值(writeBLECharacteristicValue)
- 正常读取特征值(readBLECharacteristicValue)
- 通过notifyBLECharacteristicValueChange启用通知后,能够稳定接收onBLECharacteristicValueChange回调
但当同样的代码编译为安卓APP后:
- 设备发现、连接、读写操作仍然正常
- notifyBLECharacteristicValueChange调用返回成功
- 但onBLECharacteristicValueChange回调始终无法触发
1.2 技术背景差异
微信小程序和原生安卓APP在BLE实现上有几个关键差异:
-
运行环境差异:
- 微信小程序的BLE实现基于微信自己的封装,运行在微信的沙盒环境中
- 原生APP则是直接调用安卓系统的BLE API
-
权限处理差异:
- 微信小程序已经内置处理了所有必要的BLE权限
- 原生APP需要开发者显式声明和请求权限
-
后台限制差异:
- 微信小程序有微信后台服务的支持
- 原生APP受安卓系统后台限制更严格
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题排查过程
2.1 基础检查
首先我们确认了以下基础项:
- 测试手机支持BLE(安卓4.3+)
- 蓝牙和定位权限已正确声明和获取
- 设备UUID和服务UUID正确无误
- 特征值确实支持notify/indicate
2.2 日志分析
我们在关键节点添加了详细日志:
javascript复制uni.notifyBLECharacteristicValueChange({
deviceId,
serviceId,
characteristicId,
state: true,
success: (res) => {
console.log('NOTIFY成功', res) // 这个日志在安卓和小程序都打印了
},
fail: (err) => {
console.error('NOTIFY失败', err)
}
})
uni.onBLECharac
