uni-app uni.onBLEConnectionStateChange监听回调方法重复执行
uni-app uni.onBLEConnectionStateChange监听回调方法重复执行
| 项目信息 | 详情 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Mac |
| PC开发环境版本 | 15.1.1 (24B91) |
| HBuilderX类型 | 正式 |
| HBuilderX版本 | 4.87 |
| 手机系统 | iOS |
| 手机系统版本 | iOS 18 |
| 手机厂商 | 苹果 |
| 手机机型 | iPhone15 Pro |
| 页面类型 | vue |
| vue版本 | vue3 |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
示例代码:
onBleStateChange() {
console.log("设置状态改变回调")
// 连接成功会走2次onBLEConnectionStateChange监听方法,添加状态标记去过滤
let lastState = false
uni.onBLEConnectionStateChange((res) => {
let deviceId = res.deviceId;
let connected = res.connected;
this.connect = connected;
// 避免连接成功后重复处理
if (lastState === true && connected) {
return
}
lastState = connected
console.log(`device ${deviceId} state has changed, connected: ${connected}`)
if (this.bleStateChangeBlock) {
this.bleStateChangeBlock({
deviceId,
connected
})
}
})
}
操作步骤:
设置监听方法,然后调用api去连接外设即可。
预期结果:
- 连接失败时不要走onBLEConnectionStateChange回调,不算状态发现变化。
- 连接成功时不要走2次回调,导致连接成功后业务重复处理
实际结果:
连接成功时会走2次回调,连接失败时也会走一次回调。
bug描述:
uni.onBLEConnectionStateChange监听蓝牙设备状态变化,连接成功时会走2次回调,连接失败时也会走一次回调。
更多关于uni-app uni.onBLEConnectionStateChange监听回调方法重复执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
该bug反馈内容基本完整,包含标题、详细描述、代码示例、复现步骤、预期与实际结果及分类信息。但存在两点不足:复现步骤过于简略(仅"设置监听方法,调用api连接外设"),未说明具体连接参数;预期结果中"连接失败时不走回调"不符合蓝牙状态监听设计原理——状态变化(包括失败)本应触发回调。
经核查知识库uni.onBLEConnectionStateChange文档,该API设计用于监听"包括开发者主动连接/断开、设备丢失、异常断开等所有状态变化"。连接失败属于状态变化,触发回调属正常行为,非bug。连接成功触发两次回调可能与以下因素相关:
iOS系统特性:部分iOS设备在建立稳定连接前会经历"连接中→已连接"两次状态变化
版本兼容性:用户使用HBuilderX 4.87(对应2024年Q2版本),而知识库注意事项明确提示"安卓多次调用createBLEConnection可能导致系统持有多个连接实例"
建议解决方案:
更新至最新HBuilderX版本(当前正式版已迭代至4.90+),新版可能已优化此问题
采用用户代码中的状态标记方案(lastState变量)是推荐做法,符合知识库"建议监听回调事件进行重连"的设计指引
补充说明:连接失败必须触发回调以便业务处理,预期结果1不合理;连接成功触发两次需结合具体设备日志分析,非必然bug
请优先验证最新版本行为,并参考蓝牙API最佳实践进行状态管理。 内容为 AI 生成,仅供参考
更多关于uni-app uni.onBLEConnectionStateChange监听回调方法重复执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个已知的蓝牙模块事件触发机制问题。uni.onBLEConnectionStateChange 在iOS平台确实会出现重复回调的情况,主要原因是底层系统事件触发机制导致的。
问题分析:
- 连接成功重复回调:iOS蓝牙连接过程中,系统可能会在连接建立的不同阶段多次触发状态变更事件
- 连接失败也回调:即使连接失败,系统仍会触发一次状态变更事件(从连接中变为断开)
解决方案:
建议使用防抖或状态标记来避免重复处理。你的代码已经做了正确的处理,但可以进一步优化:
onBleStateChange() {
console.log("设置状态改变回调")
let lastState = null // 初始化为null,区分初始状态
let processing = false // 防止并发处理
uni.onBLEConnectionStateChange((res) => {
// 防抖处理:避免短时间内重复处理同一状态
if (processing) return
const deviceId = res.deviceId
const connected = res.connected
// 状态未真正变化时跳过
if (lastState === connected) return
processing = true
lastState = connected
this.connect = connected
console.log(`device ${deviceId} state changed, connected: ${connected}`)
// 业务处理
if (this.bleStateChangeBlock) {
this.bleStateChangeBlock({ deviceId, connected })
}
// 处理完成后重置标志
setTimeout(() => {
processing = false
}, 100)
})
}

