苹果ios手机里蓝牙调用uni-app的uni.writeBLECharacteristicValue没有任何回调信息
苹果ios手机里蓝牙调用uni-app的uni.writeBLECharacteristicValue没有任何回调信息
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | Win11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:Win11
HBuilderX类型:正式
HBuilderX版本号:4.75
手机系统:iOS
手机系统版本号:iOS 18
手机厂商:苹果
手机机型:Iphone 12 mini
页面类型:vue
vue版本:vue2
打包方式:云端
项目创建方式:HBuilderX
示例代码:
```javascript
plus.bluetooth.writeBLECharacteristicValue({
deviceId: this.connectedDeviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
success: () => {
console.log("发送数据成功");
resolve();
},
fail: (err) => {
console.log("发送数据失败");
reject(`发送数据失败: ${err.errMsg}`);
},
complete: function() {
console.log("123456");
}
});
uni.writeBLECharacteristicValue({
deviceId: this.connectedDeviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
writeType: plus.os.name == 'iOS' ? 'write' : 'writeNoResponse',
success: () => {
console.log("发送数据成功");
resolve();
},
fail: (err) => {
console.log("发送数据失败");
reject(`发送数据失败: ${err.errMsg}`);
},
complete: function() {
console.log("123456");
}
});
操作步骤:
- 用IOS设备都能复现
预期结果:
- 成功或失败都要进入对应的success fail complete回调函数
实际结果:
- 成功了,但没进入任何回调, complete都不进入。
bug描述:
- 写好了的功能在安卓上测试都OK,想着在IOS上功能通跑一下就可以发布了,哪想到出现这个问题。先用的uni.writeBLECharacteristicValue不进任何回调,设备上已经做出响应了。后来又用plus.bluetooth.writeBLECharacteristicValue试了一下,问题依旧,问答社区搜了一下,两年前就有人提出过该问题,且没有解决。
- 官方文档这么写的:
- APP不会对写入数据包大小做限制,但系统与蓝牙设备会限制蓝牙4.0单次传输的数据大小,超过最大字节数后会发生写入错误,建议每次写入不超过20字节。
- 若单次写入数据过长,iOS 上存在系统不会有任何回调的情况(包括错误回调)。
- 我的数据只有6个字节,mtu我设置了512
更多关于苹果ios手机里蓝牙调用uni-app的uni.writeBLECharacteristicValue没有任何回调信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
我之前是可以的,现在4。75也不行了,不知道是不是hbuilerx版本的问题
更多关于苹果ios手机里蓝牙调用uni-app的uni.writeBLECharacteristicValue没有任何回调信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在iOS系统中,uni.writeBLECharacteristicValue 无回调是一个已知的系统级兼容性问题。根据你的描述,数据仅6字节且MTU设为512,排除了数据过长导致的回调丢失。
问题核心在于iOS蓝牙底层实现机制:当设备快速响应写入操作时,系统可能直接处理而不触发应用层回调。这属于平台限制,并非uni-app框架缺陷。
建议解决方案:
- 添加超时控制机制,在调用写入方法后启动定时器,超时后按失败处理
- 改用通知方式监听设备响应,通过特征值订阅实现双向通信
- 在写入前确认特征值的
properties包含write权限
代码调整示例:
const writeWithTimeout = () => {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => reject('写入超时'), 3000);
uni.writeBLECharacteristicValue({
deviceId: this.connectedDeviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
writeType: 'writeWithResponse',
success: () => {
clearTimeout(timeout);
resolve();
},
fail: (err) => {
clearTimeout(timeout);
reject(err);
}
});
});
}

