1***@qq.com
1***@qq.com
  • 发布:2025-08-05 09:48
  • 更新:2025-08-06 11:27
  • 阅读:71

IOS上uni.writeBLECharacteristicValue不进任何回调解决方案

分类:uni-app
iOS

在IOS上使用uni.writeBLECharacteristicValue写入数据,success、fail、complete是不进入任何一个的。

经我反复测试,失败是会进入fail的和complete的。所以不进入任何回调默认成功。
所以IOS上要加一个超时逻辑,进入超时就算是success.核心代码如下。
封装的sendData函数
let sendBuffer = new Promise(async (resolve, reject) => {

        var promise = new Promise((succ, err) => {  

            uni.writeBLECharacteristicValue({  
                deviceId: device.deviceId,  
                serviceId: device.writeServiceId,  
                characteristicId: device.wirteCharactId,  
                value: buffer,                    
                success: () => {  
                    console.log("发送数据成功");  
                    succ();  
                },  
                fail: (ex) => {  
                    ex=this.getError(ex);  
                    console.log("发送数据失败", ex);  

                    err(ex);  
                }  
            });  
        });  
        if (plus.os.name == 'iOS') {  

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

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

            }).finally(() => {  
                //console.log("完成了")  
            });  
        } else {  
            promise.then(resolve).catch(reject);  
        }  
    });  

    return sendBuffer;  

还有,频繁调用该方法,会进入fail,此时错误编码是10007,官方文档解释是“当前特征值不支持此操作”,
解决方案是暂停一下再重试,直到成功或提示其他错误。
调用的核心代码:
ble.sendData(f.deviceId, buffer, f.writeServiceId, f
.wirteCharactId, inteval).then(() => {

                                    console.log("发送一段成功,发送下一段");  
                                    setTimeout(sendNextVideoPacket, inteval);  
                                }).catch(err => {  
                                    if(err.code=='10007'){//遇到这个错误自动重新发送这一段数据  

                                        setTimeout(sendNextVideoPacket, inteval);//自动重试,经测试大约一秒钟后会再次成功,所以interval这里可以是1000    
                                    }else{  
                                                                                   //处理发送失败的逻辑  
                                                                          }  

                                });
0 关注 分享

要回复文章请先登录注册

1***@qq.com

1***@qq.com (作者)

回复 jagger_yu :
不知道,看到有人说3.7.11可以,我下载了也不行。
2025-08-06 11:27
jagger_yu

jagger_yu

是不是hbuliderx的版本问题,我之前可以,现在也不行了
2025-08-05 16:56
jagger_yu

jagger_yu

同问
2025-08-05 16:55