uni-app onBeaconUpdate执行30分钟之后搜索到的beacons为空数组

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app onBeaconUpdate执行30分钟之后搜索到的beacons为空数组

操作步骤:

手机一直保持亮屏,开启startBeaconDiscovery之后,onBeaconUpdate能搜索到beacons设备数组,但是执行30分钟之后,搜索到的beacons为空数组,重新stopBeaconDiscovery再startBeaconDiscovery,onBeaconUpdate又能检测到beacons数组

预期结果:

手机一直保持亮屏,开启startBeaconDiscovery之后,onBeaconUpdate能搜索到beacons设备数组,但是执行30分钟之后,还是能搜索到设备数组

实际结果:

手机一直保持亮屏,开启startBeaconDiscovery之后,onBeaconUpdate能搜索到beacons设备数组,但是执行30分钟之后,搜索到的beacons为空数组,需要重新stopBeaconDiscovery再startBeaconDiscovery,onBeaconUpdate又能检测到beacons数组

bug描述:

手机一直保持亮屏,开启startBeaconDiscovery之后,onBeaconUpdate能搜索到beacons设备数组,但是执行30分钟之后,搜索到的beacons为空数组,重新stopBeaconDiscovery再startBeaconDiscovery,onBeaconUpdate又能检测到beacons数组


2 回复

在uni-app中,如果你发现onBeaconUpdate事件在30分钟后搜索到的beacons为空数组,可能是由于多种原因导致的,比如设备权限问题、蓝牙状态变化、或者beacon设备本身的问题。以下是一个简化的代码示例,用于展示如何在uni-app中监听beacon更新,并处理可能的异常情况。

首先,确保你的项目中已经配置了必要的权限和蓝牙相关设置。

1. 初始化蓝牙适配器

在页面的onLoad或者onReady生命周期函数中初始化蓝牙适配器。

onLoad() {
  // 初始化蓝牙适配器
  uni.openBluetoothAdapter({
    success: (res) => {
      console.log('蓝牙适配器初始化成功', res);
      // 开始扫描
      this.startBeaconScan();
    },
    fail: (err) => {
      console.error('蓝牙适配器初始化失败', err);
    }
  });
}

2. 开始扫描Beacon

startBeaconScan() {
  uni.startBeaconDiscovery({
    allowDuplicatesKey: false,
    success: (res) => {
      console.log('开始扫描Beacon成功', res);
      // 监听Beacon更新事件
      uni.onBeaconUpdate((result) => {
        console.log('扫描到Beacon', result.beacons);
        // 假设我们需要在30分钟后停止扫描
        setTimeout(() => {
          this.stopBeaconScan();
        }, 30 * 60 * 1000); // 30分钟
      });
    },
    fail: (err) => {
      console.error('开始扫描Beacon失败', err);
    }
  });
}

3. 停止扫描Beacon

stopBeaconScan() {
  uni.stopBeaconDiscovery({
    success: (res) => {
      console.log('停止扫描Beacon成功', res);
      // 尝试重新初始化蓝牙适配器或者处理其他逻辑
      // 如果问题依旧,可以考虑提示用户检查蓝牙权限或者设备状态
      this.checkBluetoothStatus();
    },
    fail: (err) => {
      console.error('停止扫描Beacon失败', err);
    }
  });
}

checkBluetoothStatus() {
  uni.getBluetoothAdapterState({
    success: (res) => {
      console.log('蓝牙适配器状态', res);
      if (!res.on) {
        // 如果蓝牙未开启,提示用户开启
        uni.showModal({
          title: '提示',
          content: '蓝牙未开启,请开启蓝牙后重试',
          showCancel: false,
          success: (modalRes) => {
            if (modalRes.confirm) {
              uni.openBluetoothSettings();
            }
          }
        });
      }
    },
    fail: (err) => {
      console.error('获取蓝牙适配器状态失败', err);
    }
  });
}

以上代码提供了一个基本的框架,用于在uni-app中处理beacon扫描和异常情况。如果你发现30分钟后搜索到的beacons为空数组,可以通过checkBluetoothStatus函数检查蓝牙状态,并提示用户进行必要的操作。同时,确保你的应用有正确的权限配置,以及设备上的蓝牙和位置服务是开启的。

回到顶部