uni.getLocation静默失败主因是manifest.json配置不全:微信需mp-weixin.requiredPrivateInfos和permission.desc,App端需iOS的NSLocationWhenInUseUsageDescription及Android精确定位权限,type必须设'gcj02',res.address恒为undefined须调高德API逆解析。

直接调用 uni.getLocation 拿不到可用坐标,90% 的失败不是代码写错,而是 manifest.json 配置不全、type 参数缺失或权限未引导 —— 真机上它常静默失败,连 fail 回调都不触发。
manifest.json 权限配置必须补全三项
微信小程序、App 端、H5 行为差异大,但共性问题是:没配 manifest 就等于没申请权限。
- 微信小程序需在
mp-weixin节点下同时声明:"requiredPrivateInfos": ["getLocation"](2023 年起强制白名单,HBuilderX 不自动生成)"permission": { "scope.userLocation": { "desc": "用于显示附近门店" } }(desc不能为空格或“获取位置”这类模糊文案) - App 端(iOS/Android)要额外补:
app-plus.permissions.location.description(不能为空)
iOS 的NSLocationWhenInUseUsageDescription(填在plist下)
Android 的android.permission.ACCESS_FINE_LOCATION和ACCESS_COARSE_LOCATION - H5 无 manifest 限制,但需确保浏览器已授出地理位置权限;若用高德逆地理,还需 HTTPS + Referer 白名单
type 参数必须显式设为 'gcj02'
不传 type 或乱设值,会导致坐标系混乱:iOS 可能返回 WGS84,Android 多数返回 GCJ02,但高德/腾讯所有接口只认 GCJ02。偏差动辄几百米,uni.openLocation 跳转错位、逆地理解析到隔壁区都是常态。
-
type: 'gcj02':唯一稳妥选项,大小写敏感,不能写成'GCJ02'或'wgs84' -
type: 'wgs84':理论上返回 GPS 原始坐标,但小米、华为等机型实测仍返回 GCJ02,不可依赖 - 别信“默认就是 gcj02”——文档未定义不传时的行为,iOS 和安卓表现不一致
res.address 永远是 undefined,逆地理必须自己调
uni.getLocation 成功回调里的 res.address 字段在所有平台(微信小程序、App、H5)都恒为 undefined。这不是 bug,是 uni-app 对原生能力的统一抽象限制。
- 想拿到省市区、街道、adcode,必须调第三方逆地理接口,如高德 Web 服务:
https://restapi.amap.com/v3/geocode/regeo?location=${res.longitude},${res.latitude}&key=xxx&extensions=base
注意:location参数顺序是「经度,纬度」,和res.longitude、res.latitude顺序一致 - 高德 key 必须开通「Web 服务」+「逆地理编码」权限,并严格绑定:H5 填域名、微信小程序填 AppID、App 端填 Android 包名 / iOS Bundle ID(大小写敏感)
- 前端直连有跨域和 key 泄露风险,生产环境建议走自有服务端中转
授权失败后 uni.authorize 不会再弹窗
用户第一次点击“拒绝”,uni.authorize({ scope: 'scope.userLocation' }) 后续调用直接走 fail,且不再唤起弹窗——这是微信强制机制。
- 检测权限要用
uni.getSetting,检查res.authSetting['scope.userLocation']是否为true - 若为
false或undefined,应立即uni.showModal提示,并在 confirm 后调uni.openSetting -
uni.openSetting的success回调里,必须再次调uni.getSetting确认状态——用户可能点了「取消」而非「允许」
最易被忽略的点:uni.getLocation 不支持超时控制,网络差时会卡住;务必自行用 Promise + setTimeout 封装,否则用户会长时间看到“定位中”而无反馈。


















