Expo SDK 42及以上版本如何正确获取后台位置权限
Expo SDK 42+ 后台位置权限报错解决方案
你遇到的报错是iOS系统要求必须在Info.plist中声明定位用途描述导致的,Expo托管工作流无需手动修改Info.plist,按以下步骤操作即可解决:
1. 确认依赖安装
确保已安装适配当前SDK版本的expo-location包:npx expo install expo-location
2. 配置app.json/app.config.js
在项目根目录的配置文件中添加以下原生配置,Expo构建时会自动生成对应的Info.plist字段:
{ "expo": { // 配置expo-location插件,自动生成权限描述 "plugins": [ [ "expo-location", { "locationWhenInUsePermission": "需要前台定位权限以在使用应用时获取您的位置", "locationAlwaysAndWhenInUseUsageDescription": "需要后台定位权限以在应用退后台时持续追踪位置" } ] ], "ios": { // 声明后台运行模式,允许后台定位 "backgroundModes": ["location"], // 兼容iOS 10及更低版本的权限描述,无需兼容可删除 "infoPlist": { "NSLocationAlwaysUsageDescription": "需要后台定位权限以在应用退后台时持续追踪位置" } }, // 安卓后台定位配套权限,无需适配安卓可删除 "android": { "permissions": [ "ACCESS_FINE_LOCATION", "ACCESS_COARSE_LOCATION", "ACCESS_BACKGROUND_LOCATION" ] } } }
3. 调整权限请求逻辑
iOS系统强制要求必须先获取前台定位权限,才能发起后台权限请求,同时添加错误捕获避免未处理的Promise rejection:
async function getBackgroundLocationAsync() { // 先请求前台权限 const foregroundRes = await Location.requestForegroundPermissionsAsync(); if (foregroundRes.status !== 'granted') { setErrorMsg('前台定位权限被拒绝,无法使用定位功能'); return; } try { // 前台权限获取成功后再请求后台权限 const backgroundRes = await Location.requestBackgroundPermissionsAsync(); if (backgroundRes.status !== 'granted') { setErrorMsg('后台定位权限被拒绝,无法在后台追踪位置'); return; } const backgroundLocation = await Location.getBackgroundPositionAsync({}); setBackgroundLocation(backgroundLocation); } catch (err) { console.error('获取后台定位失败:', err); setErrorMsg('获取后台定位失败,请稍后重试'); } } getBackgroundLocationAsync();
4. 重新构建应用
修改原生配置后无法在Expo Go中直接生效,需要通过EAS构建对应包:
- 开发测试用:执行
eas build --profile development --platform ios构建开发客户端 - 正式发版用:执行
eas build --profile production --platform ios构建生产包
内容的提问来源于stack exchange,提问作者MK_Pierce
相关产品推荐
相关产品推荐

