uni-app IOS蓝牙搜索监听问题:第一次uni.onBluetoothDeviceFound能监听到很多设备,第二次搜索开始就监听不到

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

uni-app IOS蓝牙搜索监听问题:第一次uni.onBluetoothDeviceFound能监听到很多设备,第二次搜索开始就监听不到

开发环境 版本号 项目创建方式
Windows Windows 10 专业版 HBuilderX
### 操作步骤:
- openBluetoothAdapter开启蓝牙模块,进行startBluetoothDevicesDiscovery搜索,监听设备回调onBluetoothDeviceFound,刚开始第一次的时候能监听到很多设备,再重新走openBluetoothAdapter=》startBluetoothDevicesDiscovery=》onBluetoothDeviceFound

### 预期结果:
- onBluetoothDeviceFound能正常监听

### 实际结果:
- onBluetoothDeviceFound第二次开始监听部分蓝牙设备就开始减少

### bug描述:
- openBluetoothAdapter开启蓝牙模块,进行startBluetoothDevicesDiscovery搜索,监听设备回调onBluetoothDeviceFound,刚开始第一次的时候能监听到很多设备,再重新走openBluetoothAdapter到onBluetoothDeviceFound的时候,监听的回调就越来越少,甚至不回调。需要走一次closeBluetoothAdapter才回复正常。

![](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20241010/698c1139b5712d5b3f0dae52317cac11.png)

2 回复

一样的问题


在处理uni-app中IOS蓝牙搜索监听问题时,确实有时会遇到第一次能够监听到设备,但后续搜索无法继续监听的情况。这通常与蓝牙扫描的权限管理、设备状态管理以及事件监听器的正确设置有关。以下是一个简化的代码示例,展示如何在uni-app中正确设置蓝牙搜索监听器,并处理可能的权限和状态问题。

// 引入uni-app蓝牙API
const bluetooth = uni.getBluetoothManager();

// 初始化蓝牙适配器
function initBluetoothAdapter() {
    return new Promise((resolve, reject) => {
        bluetooth.openBluetoothAdapter({
            success: (res) => {
                console.log('蓝牙适配器初始化成功', res);
                resolve(res);
            },
            fail: (err) => {
                console.error('蓝牙适配器初始化失败', err);
                reject(err);
            }
        });
    });
}

// 开始搜索蓝牙设备
function startBluetoothDevicesDiscovery() {
    bluetooth.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: false,
        success: (res) => {
            console.log('开始搜索蓝牙设备', res);

            // 监听找到设备的事件
            uni.onBluetoothDeviceFound((device) => {
                console.log('找到蓝牙设备', device);
                // 在这里处理找到的设备,例如存储到列表或进行连接
            });
        },
        fail: (err) => {
            console.error('搜索蓝牙设备失败', err);
        }
    });
}

// 停止搜索蓝牙设备
function stopBluetoothDevicesDiscovery() {
    bluetooth.stopBluetoothDevicesDiscovery({
        success: (res) => {
            console.log('停止搜索蓝牙设备', res);
            // 清除事件监听器,避免内存泄漏
            uni.offBluetoothDeviceFound();
        },
        fail: (err) => {
            console.error('停止搜索蓝牙设备失败', err);
        }
    });
}

// 主流程
initBluetoothAdapter()
    .then(() => {
        startBluetoothDevicesDiscovery();

        // 模拟一段时间后停止搜索,然后重新开始搜索(用于测试)
        setTimeout(() => {
            stopBluetoothDevicesDiscovery();
            setTimeout(() => {
                startBluetoothDevicesDiscovery(); // 这里可能会遇到问题,如果监听不到设备
            }, 2000); // 等待一段时间再重新开始搜索
        }, 5000); // 搜索5秒后停止
    })
    .catch((err) => {
        console.error('初始化蓝牙适配器失败,流程终止', err);
    });

请注意,以上代码是一个简化的示例,用于展示基本的蓝牙搜索和监听流程。在实际应用中,你可能需要处理更多的边界情况和错误处理,例如用户拒绝蓝牙权限、设备蓝牙硬件不可用等。此外,IOS系统在处理蓝牙扫描时可能会有一些特定的限制和行为,比如扫描间隔、扫描时间等,这些都需要根据具体的应用场景和设备进行测试和调整。如果问题依然存在,建议查阅uni-app的官方文档或社区,看看是否有其他开发者遇到并解决了类似的问题。

回到顶部