uni.getlocation 是微信小程序获取位置的唯一可靠入口,需在 manifest.json 中声明 scope.userlocation 权限和 requiredprivateinfos、显式指定 type 参数(推荐 'gcj02')、地址解析须调用高德/腾讯服务端 api,持续定位应使用 uni.startlocationupdate + uni.onlocationchange。

uni-app 在微信小程序里获取当前位置,uni.getLocation 是唯一可靠入口,但直接调用大概率失败——不是 API 问题,而是权限、配置、坐标系三者没对齐。
manifest.json 必须声明 scope.userLocation 权限
微信强制要求提前声明定位权限,否则真机调用 uni.getLocation 会静默失败(控制台无报错,fail 回调也不触发)。必须在 manifest.json 的 mp-weixin 节点下补全:
"mp-weixin": {
"permission": {
"scope.userLocation": {
"desc": "用于显示您附近的服务"
}
},
"requiredPrivateInfos": ["getLocation"]
}
-
desc字段不能为空或纯空格,否则审核可能被拒;建议用具体业务场景描述,比如“查找附近充电桩” -
requiredPrivateInfos是微信 2023 年起新增的隐私接口白名单,漏掉它,iOS 真机必报errCode: -1, errMsg: getLocation:fail privacy permission is not authorized - HBuilderX 3.9+ 可视化配置会自动生成
permission,但不会加requiredPrivateInfos,需手动补上
uni.getLocation 的 type 参数决定坐标系和精度
微信小程序返回的经纬度默认是 GCJ02(火星坐标系),但 uni.getLocation 的 type 参数会影响实际行为:
-
type: 'wgs84':返回 WGS84 坐标(GPS 原始坐标),但微信实测中部分安卓机型(如小米、华为)仍会返回 GCJ02,不可依赖 -
type: 'gcj02':明确要求 GCJ02,兼容性最好,高德/腾讯地图 SDK 解析地址时也默认按此处理 - 不传
type:微信文档未定义行为,实测多数为 GCJ02,但 iOS 和安卓表现不一致,建议显式指定 - 注意:
uni.getLocation不支持设置超时或重试次数,网络差时容易卡住,建议自行封装 Promise +setTimeout包裹
地址解析必须用服务端或高德 SDK,别信 res.address
uni.getLocation 成功回调里的 res.address 字段永远是 undefined —— 这不是 bug,是微信设计如此。想拿到省市区街道,只有两条路:
- 前端调用高德 Web 服务(需 key):引入
amap-wx.130.js,用getRegeo方法反查,注意 key 必须绑定微信小程序合法域名(https://restapi.amap.com不行,得用自己备案的 HTTPS 域名代理) - 后端调用高德/腾讯地理编码 API:更推荐,避免 key 泄露,且可统一做缓存和限流;传
res.latitude和res.longitude给后端,返回结构化地址 - 切勿在 success 回调里硬拼“北京市朝阳区”,用户在深圳点击也会显示北京——这是新手最常踩的逻辑坑
持续定位要用 onLocationChange,不是轮询 getLocation
需要实时追踪位置(比如导航中更新车辆图标),不能 setInterval 调 uni.getLocation —— 微信限制每 5 秒最多调一次,且后台无法执行。正确做法是:
- 先调一次
uni.startLocationUpdate(前台定位),再监听uni.onLocationChange - 监听回调里拿到的
res结构和getLocation一致,但频率更高(约 1~3 秒一次),且支持后台运行(需配置mp-weixin.requiredPrivateInfos加startLocationUpdateBackground) - iOS 后台定位需额外在
manifest.json的mp-weixin下加"backgroundMode": ["location"],否则监听无效 - 记得在页面卸载时调
uni.offLocationChange,否则内存泄漏
最难绷的是:哪怕所有配置都对,某些安卓机型(尤其 OPPO、vivo)仍会因系统级定位开关关闭而返回 fail: auth deny,此时 uni.openSetting 打开的设置页未必能直达定位开关——得引导用户手动进「设置 > 应用管理 > 小程序 > 权限」里开。











