uni-app uni.onBluetoothDeviceFound在蓝牙异常断开之后再次调用不执行

uni-app uni.onBluetoothDeviceFound在蓝牙异常断开之后再次调用不执行

类型 信息
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 15872101242
HBuilderX类型 正式
HBuilderX版本 4.15
手机系统 iOS
手机系统版本 iOS 15
手机厂商 苹果
手机机型 iphone7
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

function findBPW(){
console.log('开始查找这个ios设别');
uni.onBluetoothDeviceFound(function(res) {
console.log('88888888888888888888');
if (uni.getStorageSync('activeDevide') == 'BPW2(蓝牙手表)') {
console.log('苹果bpw2');
if (res.devices[0].name == "BPW2") {
let a = ab2hex(res.devices[0].advertisData)
let str = uni.getStorageSync('mac')
let newStr = str.replace(/:/g, '').toLowerCase();
if (a.includes(newStr)) {
console.log('匹配成功');
// 代表匹配上了对应的mac地址
connect(res.devices[0].deviceId)
}
}
} else if (uni.getStorageSync('activeDevide') == 'M90(蓝牙手表)') {
if (res.devices[0].name == "M90") {
let a = ab2hex(res.devices[0].advertisData)
let str = uni.getStorageSync('mac_M90')
let newStr = str.replace(/:/g, '').toLowerCase();
console.log('这是add',a);
console.log('这是str',str);
console.log('这是newStr',newStr);
console.log('这是m90',res.devices[0]);
if (a.includes(newStr)) {
console.log('匹配成功');
// 代表匹配上了对应的mac地址
connect(res.devices[0].deviceId)
}
}
} else {
console.log(uni.getStorageSync('activeDevide'));
}
})
}

操作步骤:

写一套蓝牙连接的代码 尝试使用ios安装基座 连接成功之后关闭蓝牙设备 然后app端检测蓝牙断开 自动尝试重新搜索 这时候就发现无法执行uni.onBluetoothDeviceFound

预期结果:

希望可以执行

实际结果:

ios端不可执行

bug描述:

安卓端正常,ios上,低功耗蓝牙连接成功后,如果将蓝牙设备关机,app端无法再次执行uni.onBluetoothDeviceFound
无任何回调


更多关于uni-app uni.onBluetoothDeviceFound在蓝牙异常断开之后再次调用不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

关注相同问题,设备异常断连后,安卓手机端短时间可以用 createBLEConnection 重连上,超过1分钟就彻底连不上了,也搜不到这个设备;
相同是按官方的成对调用createBLEConnection和closeBLEConnection,官方应该修复一下这个BUG,挺严重的,导致很多蓝牙不稳定。

更多关于uni-app uni.onBluetoothDeviceFound在蓝牙异常断开之后再次调用不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html


解决了吗?

在 uni-app 中,uni.onBluetoothDeviceFound 用于监听蓝牙设备的发现事件。如果你在蓝牙异常断开之后再次调用 uni.startBluetoothDevicesDiscovery 方法时,发现 uni.onBluetoothDeviceFound 不再执行,可能是由于以下几个原因导致的:

1. 蓝牙状态未恢复

在蓝牙异常断开后,蓝牙模块可能处于一个不可用的状态。你需要确保蓝牙模块已经重新初始化并且处于可用状态。

解决方案:

  • 在重新调用 uni.startBluetoothDevicesDiscovery 之前,确保蓝牙模块已经重新初始化。你可以通过 uni.openBluetoothAdapter 来重新打开蓝牙适配器。
uni.openBluetoothAdapter({
  success: () => {
    console.log('蓝牙适配器已打开');
    uni.startBluetoothDevicesDiscovery({
      success: () => {
        console.log('开始搜索蓝牙设备');
      },
      fail: (err) => {
        console.error('搜索蓝牙设备失败', err);
      }
    });
  },
  fail: (err) => {
    console.error('打开蓝牙适配器失败', err);
  }
});

2. 事件监听未重新绑定

在蓝牙异常断开后,uni.onBluetoothDeviceFound 的监听事件可能已经被移除或失效。

解决方案:

  • 在重新调用 uni.startBluetoothDevicesDiscovery 之前,确保 uni.onBluetoothDeviceFound 的监听事件已经重新绑定。
uni.onBluetoothDeviceFound((res) => {
  console.log('发现蓝牙设备', res.devices);
});

uni.startBluetoothDevicesDiscovery({
  success: () => {
    console.log('开始搜索蓝牙设备');
  },
  fail: (err) => {
    console.error('搜索蓝牙设备失败', err);
  }
});

3. 蓝牙搜索已被停止

在蓝牙异常断开后,可能之前的蓝牙搜索已经被停止,但没有正确重新启动。

解决方案:

  • 确保在重新调用 uni.startBluetoothDevicesDiscovery 之前,之前的蓝牙搜索已经被正确停止。
uni.stopBluetoothDevicesDiscovery({
  success: () => {
    console.log('停止搜索蓝牙设备');
    uni.startBluetoothDevicesDiscovery({
      success: () => {
        console.log('开始搜索蓝牙设备');
      },
      fail: (err) => {
        console.error('搜索蓝牙设备失败', err);
      }
    });
  },
  fail: (err) => {
    console.error('停止搜索蓝牙设备失败', err);
  }
});

4. 设备或系统问题

有时,设备或系统本身的问题可能导致蓝牙功能无法正常工作。

解决方案:

  • 重启设备,或者尝试在其他设备上运行你的应用,以排除设备或系统问题。

5. 权限问题

确保应用已经获得了必要的蓝牙权限。

解决方案:

  • 检查并确保应用已经获得了访问蓝牙的权限。你可以在应用的配置文件中添加必要的权限声明。
{
  "permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于蓝牙设备搜索"
    }
  }
}
回到顶部