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

React Native应用杀死状态下蓝牙Beacon扫描实现问题

React Native杀死模式下蓝牙Beacon扫描实现方案

现有代码的局限

你当前用useFocusEffect实现的扫描,仅在页面处于活跃聚焦状态时有效。当应用被杀死后,JS线程会被终止,这段代码完全无法运行,必须依赖原生系统层面的后台扫描机制来实现。

基于react-native-ble-plx的实现步骤

Android平台

  1. 配置后台权限
    在AndroidManifest.xml中添加必要权限与服务声明:

    <!-- 基础BLE权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <!-- Android 12+后台扫描与前台服务权限 -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_BLUETOOTH_SCAN" />
    
    <!-- 声明BLE后台服务 -->
    <service
        android:name="com.polidea.reactnativeble.BleService"
        android:foregroundServiceType="location|bluetoothScan" />
    
  2. 实现后台扫描逻辑
    Android要求后台扫描必须绑定前台服务,避免被系统回收,代码示例:

    import { Platform, PermissionsAndroid } from 'react-native';
    import { BleManager } from 'react-native-ble-plx';
    
    // 请求后台权限
    const requestBackgroundPermissions = async () => {
      if (Platform.OS !== 'android') return true;
      const granted = await PermissionsAndroid.requestMultiple([
        PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
        PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
        PermissionsAndroid.PERMISSIONS.ACCESS_BACKGROUND_LOCATION,
      ]);
      return granted['android.permission.ACCESS_BACKGROUND_LOCATION'] === PermissionsAndroid.RESULTS.GRANTED;
    };
    
    // 启动后台扫描
    const startBackgroundBeaconScan = async () => {
      const hasPermissions = await requestBackgroundPermissions();
      if (!hasPermissions) return;
    
      const manager = new BleManager();
      manager.onStateChange((state) => {
        if (state === 'PoweredOn') {
          manager.startDeviceScan(
            ['0000feaa-0000-1000-8000-00805f9b34fb'],
            { 
              allowDuplicates: true, 
              scanMode: 2, // 对应Android的SCAN_MODE_LOW_LATENCY
              android: {
                useForegroundService: true,
                foregroundServiceNotificationId: 1001,
                foregroundServiceNotificationTitle: 'Beacon扫描中',
                foregroundServiceNotificationText: '正在检测周边设备'
              }
            },
            (error, device) => {
              if (error) {
                console.log('扫描错误:', error);
                return;
              }
              beaconAction(device);
            }
          );
        }
      }, true);
    };
    

iOS平台

  1. 配置后台模式
    在Info.plist中添加后台模式与位置权限描述:

    <!-- 后台BLE模式 -->
    <key>UIBackgroundModes</key>
    <array>
      <string>bluetooth-central</string>
    </array>
    
    <!-- 位置权限描述(iOS要求BLE扫描关联位置权限) -->
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>需要位置权限以检测周边Beacon设备</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>需要位置权限以检测周边Beacon设备</string>
    
  2. 实现后台扫描逻辑
    iOS杀死模式下,系统会在检测到匹配Beacon时短暂唤醒应用,代码示例:

    import { Platform, PermissionsIOS } from 'react-native';
    import { BleManager } from 'react-native-ble-plx';
    
    // 请求位置权限
    const requestBackgroundPermissions = async () => {
      if (Platform.OS !== 'ios') return true;
      const status = await PermissionsIOS.request(
        PermissionsIOS.PERMISSIONS.LOCATION_ALWAYS,
        {
          title: '位置权限请求',
          message: '需要始终允许位置权限以在后台检测Beacon',
          buttonPositive: '允许'
        }
      );
      return status === 'granted';
    };
    
    // 启动后台扫描
    const startBackgroundBeaconScan = async () => {
      const hasPermissions = await requestBackgroundPermissions();
      if (!hasPermissions) return;
    
      const manager = new BleManager();
      manager.onStateChange((state) => {
        if (state === 'PoweredOn') {
          manager.startDeviceScan(
            ['0000feaa-0000-1000-8000-00805f9b34fb'],
            { allowDuplicates: true },
            (error, device) => {
              if (error) {
                console.log('扫描错误:', error);
                return;
              }
              beaconAction(device);
            }
          );
        }
      }, true);
    };
    

替代方案:专门的Beacon库

如果react-native-ble-plx的后台/杀死模式扫描稳定性不足,可以考虑使用react-native-beacons-manager这类专门的Beacon扫描库,它针对Beacon检测做了优化,对杀死模式的支持更完善。

内容的提问来源于stack exchange,提问作者Vipul Parmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:04:51