苹果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试了一下,问题依旧,问答社区搜了一下,两年前就有人提出过该问题,且没有解决。
  • 官方文档这么写的:
    1. APP不会对写入数据包大小做限制,但系统与蓝牙设备会限制蓝牙4.0单次传输的数据大小,超过最大字节数后会发生写入错误,建议每次写入不超过20字节。
    2. 若单次写入数据过长,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框架缺陷。

建议解决方案:

  1. 添加超时控制机制,在调用写入方法后启动定时器,超时后按失败处理
  2. 改用通知方式监听设备响应,通过特征值订阅实现双向通信
  3. 在写入前确认特征值的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);
      }
    });
  });
}
回到顶部