uni.getLocation 失败多因权限或平台限制未处理:iOS需配置info.plist描述,Android 12+需声明并手动申请定位权限,H5需HTTPS且用户主动触发;必须先用uni.getSetting检查权限再调用;坐标系优先选'gcj02'以适配国内地图。

uni.getLocation 拿不到定位或报错 getLocation:fail system error
多数情况不是代码写错了,而是没配权限或平台限制没处理。iOS 和 Android 对定位的管控逻辑完全不同,uni-app 的 uni.getLocation 是个“壳”,底层走的是各端原生能力,一不注意就掉坑里。
常见错误现象:getLocation:fail system error(尤其 iOS)、返回空对象、长时间无响应、只在调试器里能用但真机不行。
- iOS 必须在
info.plist里加NSLocationWhenInUseUsageDescription描述,否则直接拒绝调用,连弹窗都不出现 - Android 12+(API 31)要求显式声明
android.permission.ACCESS_FINE_LOCATION和android.permission.ACCESS_COARSE_LOCATION,且运行时还要手动申请;uni-app 的uni.authorize对location类型在 Android 上基本无效,得用uni.openSetting引导用户去设置页开启 - H5 端依赖浏览器,Chrome 会强制要求 HTTPS,本地
http://localhost可能被拒绝;Safari 对定位更敏感,需用户主动点击触发(不能 onload 自动调),否则静默失败
uni-app 调用定位前必须先检查权限状态
直接调 uni.getLocation 很危险——用户可能已拒绝过,再调一次只会触发失败回调,不会重新弹窗。得先用 uni.getSystemInfoSync().platform 判断端,再分路径查权限。
使用场景:启动页自动定位、地图页面加载前校验、用户点击“重新定位”按钮时。
- iOS / Android:用
uni.getSetting查scope.userLocation,返回authSetting['scope.userLocation'] === true才能安全调用 - 如果为
false或undefined,别硬试,改用uni.openSetting跳转授权页(注意:H5 不支持该 API,要提前兜底) - H5 端没法查权限,只能靠
try/catch+ 错误信息判断,比如捕获到GeolocationPositionError的code === 1(PERMISSION_DENIED)就提示用户手动开启
uni.getLocation 参数选 type: 'gcj02' 还是 'wgs84'?
这不是精度问题,是坐标系兼容性问题。国内所有地图 SDK(高德、腾讯、百度)默认用国测局加密坐标系 gcj02,而 GPS 原始数据是 wgs84。选错会导致地图上位置偏移几百米甚至几公里。
性能/兼容性影响:两者调用开销几乎一样,但 wgs84 在国内地图渲染时必须手动转码,多一道计算,还容易出错。
- 如果你后续要用高德地图(
@dcloudio/uni-ui里的map组件或amap-wx),一律用type: 'gcj02' - 如果你只做后台存储备份、或对接国际服务(如 Google Maps),才考虑
wgs84,但要注意 uni-app 的uni.getLocation在 iOS 上对wgs84支持不稳定,某些系统版本会 fallback 到gcj02 - H5 端不支持
wgs84,传了也忽略,始终返回 WGS84 原始值(但浏览器本身返回的就是 WGS84,所以表现一致)
真机调试时定位成功但地图不显示标记点
这通常不是定位问题,而是坐标没传进地图组件,或者传了但格式不对。uni-app 的 map 组件(uni-map 或原生 map)对经纬度类型很敏感。
常见错误现象:控制台没报错、地图正常加载、但 markers 不显示、latitude/longitude 显示为 NaN。
- 确保传给
markers的数组里每个对象的latitude和longitude是 number 类型,不是 string(后端常返回字符串,记得parseFloat()) -
map组件的latitude和longitude属性必须是 number,且范围合法(纬度 -90~90,经度 -180~180),超限会静默失败 - Android 真机上,如果用了自定义
callout或label,某些低版本 WebView 会因样式解析失败导致 marker 消失,可先简化配置验证

















