React Native iOS选择「使用期间」权限却自动获得「始终」权限问题
React Native iOS定位权限异常:选择「使用期间」却自动获得「始终」权限的解决方案
问题原因
- Info.plist配置冗余:同时添加了
NSLocationAlwaysUsageDescription(iOS 12及以前的旧权限描述)和NSLocationAlwaysAndWhenInUseUsageDescription(iOS 13+的新权限描述),导致iOS系统权限状态判断逻辑混淆,使得check(PERMISSIONS.IOS.LOCATION_ALWAYS)返回错误的GRANTED状态。 - react-native-permissions版本/判断逻辑问题:部分旧版本的库中,
LOCATION_ALWAYS的状态判断会将「使用期间」权限误判为「始终」权限,尤其在新旧权限描述共存时更容易触发。
修复步骤
清理Info.plist冗余配置
移除旧的NSLocationAlwaysUsageDescription配置,仅保留以下两项:NSLocationWhenInUseUsageDescription:「使用期间」权限的说明文案NSLocationAlwaysAndWhenInUseUsageDescription:后续升级「始终」权限的说明文案
iOS 13+不再需要旧的NSLocationAlwaysUsageDescription,保留它会干扰系统的权限判断逻辑。
修正权限申请逻辑
iOS 13+中「始终」权限无法直接申请,必须先获取「使用期间」权限,再主动调用申请「始终」权限的接口触发系统弹窗,让用户明确选择。修改后的代码示例:if (Platform.OS === 'ios') { console.log('Requesting "When In Use" location permission for iOS...'); const whenInUseStatus = await request(PERMISSIONS.IOS.LOCATION_WHEN_IN_USE); console.log('whenInUseStatus:', whenInUseStatus); if (whenInUseStatus === RESULTS.GRANTED) { // 主动申请「始终」权限,触发系统升级弹窗 const alwaysStatus = await request(PERMISSIONS.IOS.LOCATION_ALWAYS); console.log('alwaysStatus:', alwaysStatus); if (alwaysStatus !== RESULTS.GRANTED) { Alert.alert( 'Enable "Always" Location Access', 'To provide a better experience, please enable "Always" location access in the app settings.', [ { text: 'Go to Settings', onPress: () => { Linking.openURL('app-settings:'); }, }, { text: 'Cancel', style: 'cancel' }, ] ); } } }更新react-native-permissions到稳定版
旧版本库可能存在权限状态判断bug,执行以下命令更新到最新稳定版:npm update react-native-permissions # 或使用yarn yarn upgrade react-native-permissions重置权限后测试
测试前先重置应用权限状态:- 卸载应用后重新安装
- 或在iOS设置中找到该应用,手动重置定位权限,再重新测试
关键说明
iOS 13+的权限体系中,「始终」权限是「使用期间」权限的升级项,必须通过主动申请触发二次弹窗,用户明确确认后才能获得。直接检查LOCATION_ALWAYS状态在配置冗余时会出现误判,只有通过主动申请的方式才能确保用户明确授权。
内容的提问来源于stack exchange,提问作者Akanksha Ingle
相关产品推荐
相关产品推荐

