React Native如何在Android、iOS平台获取应用后台或被杀状态的用户位置
后台及进程被杀死状态下司机位置追踪解决方案
安卓端必要配置调整
- 补全Manifest权限:安卓12及以上版本需要额外添加
ACCESS_BACKGROUND_LOCATION、FOREGROUND_SERVICE_LOCATION、POST_NOTIFICATIONS三个核心权限,这是系统要求的后台定位强制条件 - 开启前台服务:你的现有配置缺失
startForeground: true参数,安卓必须依托前台常驻通知才能保活定位进程,可将通知内容调整为用户可理解的业务相关说明,避免被系统判定为无效通知查杀 - 修复Token失效问题:你当前通过useSelector从redux内存中读取Token,应用被杀死后内存数据清空,上报请求会因为携带无效Token失败。需要将用户Token持久化存储到AsyncStorage/MMKV这类本地存储中,库初始化时从本地存储读取Token,不要依赖运行时的状态管理数据
- 规避厂商后台限制:引导用户开启应用的自启动权限、关闭电池优化、允许后台活动,国内厂商的定制系统默认会禁止第三方应用后台长期定位,可在应用内做专属引导页提示用户手动开启对应权限
现有配置参数优化
你当前的配置可做如下调整适配需求:
// 从持久化本地存储读取Token,不要用useSelector从内存读取 const Token = await AsyncStorage.getItem('AccessToken'); BackgroundGeolocation.configure({ desiredAccuracy: BackgroundGeolocation.HIGH_ACCURACY, stationaryRadius: 10, // 司机端多为运动场景,调低阈值避免漏更位置 distanceFilter: 30, // 调低到30米,适配低速行驶场景的更新需求 notificationTitle: '正在获取位置以提供派单服务', notificationText: '服务运行中', debug: false, startOnBoot: true, stopOnTerminate: false, startForeground: true, // 新增参数,强制开启安卓前台服务保活 locationProvider: Platform.OS === 'android' ? BackgroundGeolocation.DISTANCE_FILTER_PROVIDER // 替换为距离过滤提供者,比活动提供者更适配持续运动场景 : BackgroundGeolocation.DISTANCE_FILTER_PROVIDER, interval: 10000, fastestInterval: 5000, // 调低最快更新间隔,提升位置更新及时性 activitiesInterval: 2000, stopOnStillActivity: false, url: CONSTANTS.BaseUrl + 'driver/updateCoordinate', syncUrl: CONSTANTS.BaseUrl + 'driver/updateCoordinate', syncThreshold: 1, // 新增参数,只要有1个未同步点位就触发重试 maxLocations: 100, // 新增参数,最多缓存100个点位避免占用过多存储 httpHeaders: { Authorization: Token, }, postTemplate: { latitude: '@latitude', longitude: '@longitude', }, });
iOS端适配要求
- Xcode中开启项目后台模式的
Location Updates选项 - 向用户申请
始终允许定位权限,仅“使用期间允许”的权限无法支持进程被杀死后的位置更新 - 配置
pausesLocationUpdatesAutomatically: false,关闭iOS系统自动暂停定位更新的默认逻辑 - 开启
showsBackgroundLocationIndicator: true,状态栏显示定位图标,提升进程优先级避免被系统查杀
测试注意事项
- 必须使用真机测试,模拟器的后台权限逻辑和真机不一致
- 安卓端使用release包测试,debug包的调试逻辑会导致进程更容易被系统回收
- 测试前确认应用已经获得所有要求的定位、通知权限,且已关闭电池优化限制
内容的提问来源于stack exchange,提问作者Muneeb Ahmed
相关产品推荐
相关产品推荐

