Flutter使用geolocator在iOS真机无法获取GPS的问题求助
解决iOS真机无法通过geolocator获取GPS的问题
问题核心原因
- geolocator 7.7.1版本存在iOS 16+兼容性问题,原生代码直接在主线程调用定位服务检查方法,触发系统警告且可能导致定位流程异常
- info.plist权限配置不符合iOS 13+规范,旧权限键已被弃用
- 未遵循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
相关产品推荐
相关产品推荐

