React Native 0.59升级Android API 29后如何申请后台定位权限
Android API 29+ React Native 后台定位权限获取方案
核心规则说明
Android 10(API 29)对后台定位权限的申请逻辑做了强制性调整:
- 必须先成功获取前台定位权限(
ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION),才能申请后台定位权限 - 不可同时申请前台+后台定位权限,否则系统不会展示「始终允许」选项
- React Native 0.59版本的
PermissionsAndroid未内置ACCESS_BACKGROUND_LOCATION常量,需要手动传入完整权限字符串
修改后的权限申请代码
export async function requestLocationPermission() { try { // 第一步:先申请前台定位权限 const foregroundGranted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION ); if (foregroundGranted !== PermissionsAndroid.RESULTS.GRANTED) { // 前台定位未授权,直接返回对应结果 return foregroundGranted === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN ? PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN : PermissionsAndroid.RESULTS.DENIED; } // 第二步:前台定位授权通过后,申请后台定位权限 const backgroundGranted = await PermissionsAndroid.request( // RN 0.59无内置常量,手动传入完整权限字符串 "android.permission.ACCESS_BACKGROUND_LOCATION" ); if (backgroundGranted === PermissionsAndroid.RESULTS.GRANTED) { // 前后台权限都已获取 return PermissionsAndroid.RESULTS.GRANTED; } else if (backgroundGranted === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) { return PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN; } else { // 后台权限被拒,仅获得前台定位权限,可根据业务需求调整返回值 return "foreground_granted"; } } catch (err) { return false; } };
补充注意事项
- 若后续将targetSdkVersion升级到30(Android 11)及以上,后台定位权限申请逻辑会再次变更:系统不会直接弹出授权弹窗,会自动跳转至应用权限设置页,需要用户手动选择「始终允许」选项
- 若应用需要上架Google Play,必须明确向用户说明后台定位的具体使用场景,否则会被平台拒审
内容的提问来源于stack exchange,提问作者Riku
相关产品推荐
相关产品推荐

