雪趣snow66
雪趣snow66
  • 发布:2023-12-31 00:08
  • 更新:2025-07-18 17:12
  • 阅读:742

【报Bug】ios端使用uni.writeBLECharacteristicValue 向设备发送关机指令后没有success或fail回调,安卓正常

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 10

HBuilderX类型: 正式

HBuilderX版本号: 3.99

手机系统: iOS

手机系统版本号: iOS 12.4

手机厂商: 苹果

手机机型: iphone6 plus

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

uni.writeBLECharacteristicValue({
deviceId: params.device_id,
serviceId: params.service_id,
characteristicId: params.characteristic_id,
value: hexStringToBuffer(params.command),// 这里的value是ArrayBuffer类型
success: (res) => {
console.log('writeBLECharacteristicValue success', res.errMsg)

        typeof params.exec == "function" && params.exec(res);  

    },  
    fail: (res) => {  
        console.log('writeBLECharacteristicValue fail:', res)  

    }     
})

操作步骤:

发送设备关机得指令时才没回调

预期结果:

只要写成功都应该有成功或失败得回调

实际结果:

只要写成功但没有成功或失败得回调

bug描述:

【报Bug】ios端使用uni.writeBLECharacteristicValue 向设备发送关机指令,writeBLECharacteristicValue 没有success或fail回调,安卓正常

2023-12-31 00:08 负责人:DCloud_iOS_WZT 分享
已邀请:
雪趣snow66

雪趣snow66 (作者)

Android write成功后有回调,ios没有。是uni.writeBLECharacteristicValue的回调没有不是notify

DCloud_iOS_WZT

DCloud_iOS_WZT

https://uniapp.dcloud.net.cn/api/system/ble.html#writeblecharacteristicvalue 看下注意事项 是不是写入数据过长了

  • 1***@qq.com

    没用,标明的20字节,我才8字节。

    2025-07-18 17:11

1***@qq.com

1***@qq.com

距离这个帖子两年了,该问题依旧,我想到个不是很合适又无赖的办法,再写个超时的promise,跟发送数据的用Promise.race做竞争返回-1做为异常,如果出现-1就表示是超时了,还是走resolve。

// 发送数据通用方法
sendData(buffer) {

        return new Promise(async (resolve, reject) => {    

            var promise = new Promise((succ, err) => {    
                uni.writeBLECharacteristicValue({    
                    deviceId: this.connectedDeviceId,    
                    serviceId: this.serviceId,    
                    characteristicId: this.writeCharacteristicId,    
                    value: buffer,    
                    writeType: plus.os.name == 'iOS' ? 'write' : 'writeNoResponse',    
                    success: () => {    
                        console.log("发送数据成功");    
                        succ();    
                    },    
                    fail: (err) => {    
                        console.log("发送数据失败", err);    
                        err(`发送数据失败: ${err.errMsg}`);    
                    },    
                    complete: function() {    
                        console.log("123456");    
                    }    
                });    
            });    
            if (plus.os.name == 'iOS') {    

                function timeout(ms) {    
                    return new Promise((_, err) => {    
                        setTimeout(() => {    
                            err({    
                                code: -1,    
                                errMsg: '超时了'    
                            })    
                        }, ms);    
                    });    
                }    

                Promise.race([promise, timeout(500)]).then(resolve).catch((ex) => {    
                    console.log("ex=",ex);    
                    if (ex.code == -1) {    
                        resolve();    
                    } else {    
                        reject();    
                    }    

                }).finally(() => {    
                    console.log("完成了")    
                });    
            } else {    
                promise.then(resolve).catch(reject);    
            }    
        });    
    },
  • 1***@163.com

    强啊

    2025-07-19 10:46

  • 1***@qq.com

    回复 1***@163.com: 无奈之举啊,我们最好的办法是让硬件工程师把成功失败返回给我,哪一包成功哪一包失败状态都返回。没有硬件工程师只能这样做了。

    2025-07-21 14:50

要回复问题请先登录注册