You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS端BLE外设首次扫描后从应用扫描列表消失的问题咨询

问题分析

当前使用Svelte Native结合NativeScript Community BLE开发的应用,Android端蓝牙扫描STM32WB设备完全正常,但iOS端仅首次/前两次扫描能发现目标设备,后续无法找到;而ST官方BLE Toolbox可正常发现设备,说明问题出在应用扫描逻辑或NativeScript BLE库的iOS适配处理上。

核心可能原因:

  • iOS蓝牙栈对已发现设备的缓存机制,avoidDuplicates参数在iOS与Android上的行为存在差异
  • 未指定目标设备的服务UUID,导致iOS扫描策略偏向依赖缓存而非主动探测
  • 设备列表更新逻辑未正确处理iOS返回的设备标识
解决方案

1. 扫描特定服务UUID(最关键)

iOS蓝牙扫描未指定服务UUID时,会依赖系统缓存,对已发现过的设备不会重复返回广播包。STM32WB开发板必然带有特定BLE服务UUID(自定义服务或ST默认服务),直接扫描该UUID可绕过缓存,强制iOS主动探测目标设备,同时过滤无关设备。

修改扫描代码,用startScanningForServices替代startScanning,传入目标设备的服务UUID数组:

// 替换原startScanning部分
await bluetooth.startScanningForServices(
    ["你的STM32WB服务UUID"], // 示例:"0000FFE0-0000-1000-8000-00805F9B34FB"
    {
        seconds: 4,
        onDiscovered: (device) => {
            // 基于设备UUID做去重(iOS的device.uuid为稳定标识)
            const exists = devices.some(d => d.uuid === device.uuid);
            if (!exists) {
                devices = [...devices, device];
            }
        },
        avoidDuplicates: true
    }
).then(() => {
    isScanning = false;
}).catch((err) => {
    console.log("SCAN ERROR:", err);
});

2. 优化设备列表更新逻辑

原代码中devices = [...devices, device]在avoidDuplicates失效时会重复添加设备,且iOS返回的device对象可能存在标识不一致情况,建议基于设备uuid(而非名称)做去重判断,确保列表更新准确。

3. 调整扫描前的重置逻辑

iOS上stopScanning的异步处理可能存在延迟,建议去掉固定500ms延迟,改为等待stopScanning完成后再启动扫描,同时添加日志确认状态:

async function toggleScan() {
    if (isScanning) return;
    const allowed = await requestBluetoothPermissions();
    if (!allowed) return;
    isScanning = true;
    devices = [];

    // 确保扫描完全停止
    try {
        await bluetooth.stopScanning();
        console.log("扫描已停止");
    } catch(e) {
        console.error("停止扫描失败:", e);
    }

    // 直接启动扫描,无需固定延迟
    await bluetooth.startScanningForServices(
        ["你的STM32WB服务UUID"],
        {
            seconds: 4,
            onDiscovered: (device) => {
                const exists = devices.some(d => d.uuid === device.uuid);
                if (!exists) {
                    devices = [...devices, device];
                }
            },
            avoidDuplicates: true
        }
    ).then(() => {
        isScanning = false;
        console.log("扫描结束");
    }).catch((err) => {
        console.log("SCAN ERROR:", err);
        isScanning = false;
    });
}

4. 检查STM32WB广播配置

虽然ST工具能扫到设备,仍需确认开发板广播参数:

  • 确保广播间隔设置在iOS允许范围内(建议100ms~1000ms)
  • 确认广播包中包含服务UUID(保证iOS能通过服务UUID扫描到设备)
验证步骤
  1. 替换代码后重新构建iOS应用
  2. 多次执行扫描操作,观察目标设备是否每次都能出现
  3. 若仍有问题,打开NativeScript调试日志,查看BLE库在iOS上的扫描回调详情,确认是否收到目标设备的广播包

内容的提问来源于stack exchange,提问作者Melody Parker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:32:31