uni.getLocation是唯一可靠入口,真机失败主因是manifest.json配置错误(mp-weixin下缺permission desc或requiredPrivateInfos)、权限未检查、type未设gcj02、未处理超时及地址需后端解析。
直接说结论:uni.getlocation 是唯一可靠入口,但真机调用失败几乎全是配置或权限问题,不是代码写错了。
manifest.json 必须补全 mp-weixin.permission 和 requiredPrivateInfos
微信小程序从 2023 年起强制要求两项声明,缺一不可:
-
scope.userLocation的desc字段不能为空、不能纯空格,且需具业务指向性(比如“查找附近充电桩”,不能写“提升体验”) -
requiredPrivateInfos: ["getLocation"]必须显式添加,HBuilderX 可视化配置不会自动生成它
常见错误:
- 把
permission写在根节点或app-plus下,实际必须放在"mp-weixin"节点内 -
desc值为" "或"定位",审核被拒或真机静默失败(fail 回调都不触发) - iOS 真机报错
errCode: -1, errMsg: getLocation:fail privacy permission is not authorized,基本就是漏了requiredPrivateInfos
调用前必须用 uni.getSetting 检查权限状态
直接调 uni.getLocation() 非常危险——用户之前点过“拒绝”,再调一次不会弹窗,只会进 fail 回调。
正确流程是:
- 先调
uni.getSetting(),检查authSetting['scope.userLocation'] - 若为
true,可安全调用uni.getLocation - 若为
false或undefined,应引导用户去设置页:uni.openSetting()(注意 H5 不支持该 API,需提前判断平台并降级)
H5 端无法查权限,只能靠 try/catch 捕获 GeolocationPositionError 的 code === 1(PERMISSION_DENIED)来提示用户手动开启。
type 参数必须显式设为 'gcj02',别信默认值
-
type: 'wgs84'在部分安卓机型(小米、华为)仍返回 GCJ02,不可靠 - 不传
type时,iOS 和安卓行为不一致,文档也未定义 -
type: 'gcj02'是国内地图服务(高德、腾讯、uni-app map 组件)的默认适配坐标系,兼容性最好
另外注意:
-
uni.getLocation不支持超时控制,网络差时容易卡住,建议自己用Promise.race([getLocation(), new Promise(r => setTimeout(r, 8000))])包一层 - 返回值中
res.address永远是undefined,这是微信设计如此,地址解析必须走后端调高德/腾讯 API,或前端用amap-wx.130.js的getRegeo(key 必须绑定你自己的 HTTPS 域名)
持续定位要用 uni.startLocationUpdate + uni.onLocationChange
单次 getLocation 适合“点击定位”场景;需要实时更新(如导航中),得用:
-
uni.startLocationUpdate({ success, fail })启动后台定位(App 和微信小程序支持) -
uni.onLocationChange(callback)监听位置变化(注意:微信基础库需 ≥ 2.9.0) - 切记调用
uni.stopLocationUpdate()释放资源,否则耗电严重
App 端还需在 manifest.json → app-plus → distribute → android/ios 中补全原生权限(如 ACCESS_FINE_LOCATION)和 iOS 的 NSLocationWhenInUseUsageDescription 描述。
真正的坑不在代码里,而在 manifest 的一个 desc 字段、requiredPrivateInfos 是否存在、type 是否显式指定——这些地方错一点,真机就彻底没反应。











