IOS 蓝牙无法完全断开的uni-app问题

IOS 蓝牙无法完全断开的uni-app问题

项目信息 详情
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win11
HBuilderX类型 正式
HBuilderX版本号 4.66
手机系统 iOS
手机系统版本号 iOS 16
手机厂商 苹果
手机机型 iPhone 13
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

uni.createBLEConnection({
    timeout: 5000,
    deviceId,
    success: res => {
        console.log(res);
        console.log('连接蓝牙成功:' + res.errMsg);
    },
    fail: e => {
        console.log('连接蓝牙失败,错误码:' + e.errCode);
    }
})

操作步骤:

a页面进b页面调用uni.createBLEConnection连接一台蓝牙设备,过段时间调用uni.closeBLEConnection+uni.closeBluetoothAdapter断开连接返回a页面,第二次再从a页面进入b页面就连接不了设备也发现不了设备了

预期结果:

APP断开蓝牙连接,系统蓝牙模块也应断开

实际结果:

APP调用uni.closeBLEConnection断开连接返回成功,uni.onBLEConnectionStateChange也监听到蓝牙设备断开连接,但系统蓝牙模块并未断开,后续获取已连接设备中找不到,搜索发现设备也找不到

bug描述:

uniapp打包IOS APP,APP连接uni.createBLEConnection成功回调,再调用uni.closeBLEConnection+uni.closeBluetoothAdapter断开连接,回调已成功。通过uni.onBLEConnectionStateChange()方法也监听到蓝牙连接状态断开了,但实际ios设置中的蓝牙设备状态并未断开还是已连接状态,系统蓝牙模块并未断开;后面再想继续连接蓝牙也连接不了,使用uni.getConnectedBluetoothDevices()方法也找不到这个已连接的设备,因为蓝牙实际未断开用uni.onBluetoothDeviceFound()方法也发现不了这个设备


更多关于IOS 蓝牙无法完全断开的uni-app问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

iOS连接了蓝牙之后是系统接管了这个蓝牙的连接状态了,只能去获取当前是否连接着蓝牙,然后再用createBLEConnection连接;

更多关于IOS 蓝牙无法完全断开的uni-app问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


你好,请问一下,那我想通过app去连接另一台设备的话,就只能手动去设置里断开忽略上一台蓝牙设备了吗?或者说还有没有其他的什么方法呢

回复 Youyongnan: 你连接另一台设备为啥需要去断开忽略上一台设备,不同设备之间蓝牙id都是不一样的,可以发现和连接的呀

回复 qjr: 因为我这边要求只保留一台设备是处于连接状态的,不要多台设备连接;还有就是如果我就想对一台设备进行连接断开重复这个过程,按照目前uni的官方api可以实现嘛

回复 Youyongnan: android是可以实现的,iOS端的就不行了,不是uni的API不行,是iOS系统对蓝牙功能的处理不同;你可以用一些蓝牙调试工具去测试的一下是否能符合你的业务逻辑;

回复 qjr: 好的 谢谢啦!

这是一个典型的iOS蓝牙连接状态同步问题。在iOS系统中,蓝牙连接状态由系统统一管理,应用层调用closeBLEConnection后,系统可能不会立即释放物理连接。

根据你的描述,问题可能出现在以下几个方面:

  1. 蓝牙适配器关闭时机不当:在调用closeBLEConnection后立即调用closeBluetoothAdapter可能导致连接未完全释放。

  2. iOS系统蓝牙缓存机制:iOS会缓存蓝牙连接状态,即使应用断开连接,系统可能仍保持物理连接一段时间。

建议优化断开连接流程:

// 先断开设备连接
uni.closeBLEConnection({
    deviceId,
    success: () => {
        console.log('设备连接已断开');
        // 延迟关闭适配器,确保连接完全释放
        setTimeout(() => {
            uni.closeBluetoothAdapter({
                success: () => {
                    console.log('蓝牙适配器已关闭');
                }
            });
        }, 1000);
    }
});

另外,建议在重新连接前检查蓝牙适配器状态:

uni.openBluetoothAdapter({
    success: () => {
        // 适配器开启成功后再进行连接
        uni.createBLEConnection({
            deviceId,
            success: res => {
                console.log('重新连接成功');
            }
        });
    }
});
回到顶部