文艺程序猿
文艺程序猿
  • 发布:2025-12-19 17:33
  • 更新:2025-12-19 17:34
  • 阅读:9

【报Bug】uni.onBLEConnectionStateChange监听回调方法重复执行

分类:uni-app

产品分类: 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去连接外设即可。

预期结果:

1、连接失败时不要走onBLEConnectionStateChange回调,不算状态发现变化。
2、连接成功时不要走2次回调,导致连接成功后业务重复处理

实际结果:

连接成功时会走2次回调,连接失败时也会走一次回调。

bug描述:

uni.onBLEConnectionStateChange监听蓝牙设备状态变化,连接成功时会走2次回调,连接失败时也会走一次回调。

2025-12-19 17:33 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

该bug反馈内容基本完整,包含标题、详细描述、代码示例、复现步骤、预期与实际结果及分类信息。但存在两点不足:复现步骤过于简略(仅"设置监听方法,调用api连接外设"),未说明具体连接参数;预期结果中"连接失败时不走回调"不符合蓝牙状态监听设计原理——状态变化(包括失败)本应触发回调。

经核查知识库uni.onBLEConnectionStateChange文档,该API设计用于监听"包括开发者主动连接/断开、设备丢失、异常断开等所有状态变化"。连接失败属于状态变化,触发回调属正常行为,非bug。连接成功触发两次回调可能与以下因素相关:

  1. iOS系统特性:部分iOS设备在建立稳定连接前会经历"连接中→已连接"两次状态变化
  2. 版本兼容性:用户使用HBuilderX 4.87(对应2024年Q2版本),而知识库注意事项明确提示"安卓多次调用createBLEConnection可能导致系统持有多个连接实例"

建议解决方案:

  1. 更新至最新HBuilderX版本(当前正式版已迭代至4.90+),新版可能已优化此问题
  2. 采用用户代码中的状态标记方案(lastState变量)是推荐做法,符合知识库"建议监听回调事件进行重连"的设计指引
  3. 补充说明:连接失败必须触发回调以便业务处理,预期结果1不合理;连接成功触发两次需结合具体设备日志分析,非必然bug

请优先验证最新版本行为,并参考蓝牙API最佳实践进行状态管理。

内容为 AI 生成,仅供参考

要回复问题请先登录注册