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

Expo定位功能异常:已配置App.json仍报错求助

定位追踪器权限配置错误排查与修复

针对你遇到的两个定位权限错误,以下是具体的排查和修复步骤:

核心问题分析

你的问题主要源于权限配置冲突和后台权限未正确请求,结合Expo的配置规则,逐一解决如下:


1. 移除重复的权限描述配置

你在app.json中同时通过ios.infoPlist和expo-location插件配置了位置权限描述,这会导致Expo打包时的配置冲突。Expo的expo-location插件会自动生成对应的Info.plist条目,手动添加会引发覆盖或无效问题。

修正后的app.json关键配置:

{
  "expo": {
    ...
    "permissions": [
      "location",
      "fetch"
    ],
    "ios": {
      "supportsTablet": true,
      "infoPlist": {
        "UIBackgroundModes": [
          "location",
          "fetch",
          "remote-notification"
        ]
        // 移除所有NSLocation*UsageDescription相关条目
      }
    },
    "plugins": [
      [
        "expo-location",
        {
          "locationAlwaysAndWhenInUsePermission": "允许$(PRODUCT_NAME)使用您的位置,用于定位追踪功能。",
          "locationAlwaysPermission": "允许$(PRODUCT_NAME)在后台使用您的位置,实现持续追踪。"
        }
      ]
    ]
  }
}

2. 恢复后台位置权限请求代码

你注释了后台权限请求逻辑,而Location.startLocationUpdatesAsync必须在获得后台位置权限后才能调用,否则会触发"Background Location has not been configured"错误。

修正后的权限处理代码:

const permissionHandler = async () => {
  const { status } = await Location.requestForegroundPermissionsAsync();
  if (status === "granted") {
    const { status: backgroundStatus } =
        await Location.requestBackgroundPermissionsAsync();
    if (backgroundStatus === "granted") {
        getLocationAsync();
    }
  }
};

3. 彻底清理缓存并重新构建

之前的缓存清理可能不彻底,执行以下命令确保配置生效:

# 清除Expo开发服务器缓存并重启
expo r -c

# 如果使用EAS构建,额外清除构建缓存
eas build --clear-cache

4. 额外注意事项

  • 后台定位功能仅支持真实iOS设备,模拟器无法测试该功能;
  • 确保Expo SDK版本与expo-location、expo-task-manager版本兼容,建议使用最新稳定版;
  • iOS 13+仅需locationAlwaysAndWhenInUsePermission配置,Expo插件会自动处理低版本系统的兼容逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:18:36