在iOS上第一次扫描后,为什么我的BLE外设会从应用的扫描菜单中消失?

移动开发 2026-07-10

我正在尝试开发一个使用Svelte Native的自定义应用(这是基于Svelte的跨平台开发工具)以及 NativeScript Community BLE library。这个应用旨在连接基于STM32WB的微控制器开发板。当我为Android构建时,一切都工作得很完美,应用能够稳定地连接到设备。此时的扫描器只是设计用来扫描所有可见的蓝牙设备,并不一定只筛选我们的设备。因此,会出现许多杂散设备,甚至在前几次扫描后也不会消失,即使在iOS上也是如此。

然而,当我为iOS构建应用时,STM32开发板会在第一次或前两次扫描中出现,但随后就再也看不到。你有什么可能的原因吗?我觉得这可能是某种缓存问题,但我不太确定。

我已经尝试重启iOS设备(我用过iPhone和 iPad)、卸载并重新构建应用、重置网络设置,以及从板子的角度重命名外设。看起来这似乎不是iOS的问题,因为ST BLE Toolbox应用能够看到它并轻松连接到它,所以很可能是应用本身的问题。以下是当前用于蓝牙扫描的代码,如果有帮助的话。

const bluetooth = new Bluetooth();
// other code exists
async function toggleScan() {
        if (isScanning) return;
        const allowed = await requestBluetoothPermissions();
        if (!allowed) return;
        isScanning = true;
        devices = []; // Clear list
        try { await bluetooth.stopScanning(); } catch(e) {console.err(e)}
        await new Promise(resolve => setTimeout(resolve, 500));
        // this is just in case it is somehow already scanning, which might cause problems

        await bluetooth.startScanning({
            seconds: 4, // Give it lots of time
            onDiscovered: (device) => {
                devices = [...devices, device];
            },
            avoidDuplicates: true
        }).then(() => {
            isScanning = false;
        }).catch((err) => {
            console.log("SCAN ERROR:", err);
        });
    }

我还尝试把这段代码中的 avoidDuplicates 设置为 false,似乎也没有什么用。

任何帮助都将不胜感激。

解决方案

iOS对 BLE扫描非常严格,可能在第一次扫描后为了省电而对设备进行限流。尝试把扫描时间从4 秒降到2 秒。此外,请再次确认你的Info.plist拥有正确的蓝牙权限(NSBluetoothAlwaysUsageDescription)。NativeScript BLE库在iOS上也可能有一些怪癖,因此也去查看他们的GitHub Issues。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章