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去连接外设即可。

预期结果:

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

实际结果:

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

bug描述:

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


更多关于uni-app uni.onBLEConnectionStateChange监听回调方法重复执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

该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平台确实会出现重复回调的情况,主要原因是底层系统事件触发机制导致的。

问题分析:

  1. 连接成功重复回调:iOS蓝牙连接过程中,系统可能会在连接建立的不同阶段多次触发状态变更事件
  2. 连接失败也回调:即使连接失败,系统仍会触发一次状态变更事件(从连接中变为断开)

解决方案:

建议使用防抖或状态标记来避免重复处理。你的代码已经做了正确的处理,但可以进一步优化:

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)
    })
}
回到顶部