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

使用Expo开发iOS应用:Geolocation API报错及Info.plist配置求助

问题解决方法

核心原因

你用Expo创建的是托管式React Native项目,这类项目会屏蔽原生配置文件(比如Info.plist),也不支持react-native link命令。你使用的react-native-geolocation-service和@react-native-community/geolocation都是针对裸React Native项目的原生依赖,在Expo环境下无法正常加载,所以会报NativeModules.RNCGeolocation is null错误。

正确解决方案:使用Expo官方定位API

Expo提供了封装好的expo-location库,无需处理原生配置,直接就能在Expo项目中使用:

  1. 安装依赖
    在项目根目录执行命令:

    npx expo install expo-location
    
  2. 配置定位权限
    在项目根目录的app.json(或app.config.js)中,添加iOS的权限描述(对应原Info.plist的字段):

    {
      "expo": {
        "ios": {
          "infoPlist": {
            "NSLocationWhenInUseUsageDescription": "需要获取您的位置信息以提供相关服务",
            "NSLocationAlwaysAndWhenInUseUsageDescription": "需要持续获取您的位置信息以提供相关服务"
          }
        }
      }
    }
    

    把描述文本替换为你的实际业务说明即可。

  3. 编写获取定位的代码示例

    import * as Location from 'expo-location';
    
    const getCurrentLocation = async () => {
      // 请求定位权限
      let { status } = await Location.requestForegroundPermissionsAsync();
      if (status !== 'granted') {
        console.log('定位权限被拒绝');
        return;
      }
    
      // 获取当前位置
      let location = await Location.getCurrentPositionAsync({});
      console.log('当前位置:', {
        latitude: location.coords.latitude,
        longitude: location.coords.longitude
      });
    };
    
  4. iOS模拟器设置
    iOS模拟器默认没有真实位置,需要手动指定:

    • 打开模拟器,点击顶部菜单的Debug → Location
    • 选择一个预设位置(比如Apple),或者自定义坐标
  5. 重启项目
    保存配置后,重启Expo开发服务器(npx expo start --clear),重新在模拟器中加载应用即可。

注意事项

  • 不要尝试eject(eject会把托管项目转为裸项目,复杂度大幅提升),使用Expo官方API是最适配的方案。
  • 如果需要后台定位,还需在app.json中配置UIBackgroundModes为location。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:54:20