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

Flutter使用geolocator在iOS真机无法获取GPS的问题求助

解决iOS真机无法通过geolocator获取GPS的问题

问题核心原因

  1. geolocator 7.7.1版本存在iOS 16+兼容性问题,原生代码直接在主线程调用定位服务检查方法,触发系统警告且可能导致定位流程异常
  2. info.plist权限配置不符合iOS 13+规范,旧权限键已被弃用
  3. 未遵循iOS定位授权的正确流程,直接调用位置获取方法可能导致权限校验不通过

具体解决步骤

1. 升级geolocator到最新稳定版

geolocator 7.x版本对iOS 16的支持不完善,建议升级到8.x及以上版本:

flutter pub upgrade geolocator

2. 修正info.plist权限配置

iOS 13+已弃用NSLocationAlwaysUsageDescription,需替换为新权限键,按需添加后台权限:

<key>NSLocationWhenInUseUsageDescription</key>
<string>需要获取您的位置信息以提供相关服务</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>需要始终获取您的位置信息以提供相关服务</string>
<!-- 若需后台定位,添加以下配置 -->
<key>NSLocationBackgroundUsageDescription</key>
<string>后台需要获取您的位置信息以提供相关服务</string>

3. 调整Flutter端代码,遵循定位授权流程

先检查权限、定位服务状态,再执行位置获取,避免主线程阻塞和流程异常:

Future<Position> getGps(BuildContext context) async {
  // 检查并请求定位权限
  LocationPermission permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      throw Exception("定位权限被拒绝");
    }
  } else if (permission == LocationPermission.deniedForever) {
    throw Exception("定位权限被永久拒绝,请前往设置开启");
  }

  // 检查定位服务是否开启
  bool serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    throw Exception("定位服务未开启,请前往设置开启");
  }

  // 获取当前位置
  return await Geolocator.getCurrentPosition(
    desiredAccuracy: LocationAccuracy.high,
    timeLimit: Duration(seconds: 5),
  );
}

4. 检查设备设置

  • 确保iPhone的「设置-隐私与安全性-定位服务」已开启
  • 确认应用的定位权限设置为「使用期间允许」或「始终允许」

验证

重新编译并运行到iOS真机,此时应该能正常获取GPS信息,且主线程警告消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:20:32