uni.getLocation仅返回经纬度,因原生API不支持逆地理编码;需调用高德/腾讯SDK将GCJ02坐标转换后请求地址信息,并确保manifest权限、坐标系匹配及服务端配置正确。

uni.getLocation 为什么只拿到经纬度,拿不到省市区?
因为 uni.getLocation 是原生定位 API,它只负责从系统读取设备坐标(WGS84 或 GCJ02),不带地址解析能力——这属于「逆地理编码」,得调第三方地图 SDK(高德/腾讯)额外请求。
常见错误现象:
• 控制台打印出 res.latitude 和 res.longitude,但 res.address 是 undefined
• 直接在 success 回调里拼接「北京市朝阳区」这类字符串,结果全是硬编码、无法适配用户真实位置
- 必须先确保
manifest.json中已配置微信小程序的地理位置权限,包括"requiredPrivateInfos": ["getLocation"]和"permission"下的scope.userLocation描述文案 - 微信要求描述文案不能空或模糊,例如「用于展示附近门店」比「位置测试」更易过审
- 坐标系选
type: 'gcj02'(国内地图标准),别用wgs84后直接喂给高德 API——会偏移几百米
持续定位要用 startLocationUpdate + onLocationChange,不是轮询
uni.startLocationUpdate 是微信小程序原生支持的前台持续定位机制,和手动 setInterval 调 uni.getLocation 完全不同:前者由系统调度、省电、精度可控;后者频繁触发会卡顿、被系统限频、iOS 上大概率失败。
- 必须先调
uni.startLocationUpdate成功后,再监听uni.onLocationChange,否则监听器收不到任何数据 - 持续定位需用户保持小程序在前台,后台时默认停止(除非你额外申请并配置了
startLocationUpdateBackground权限,但审核极严) - 每次触发
onLocationChange回调,res里只有latitude、longitude、speed等原始字段,仍需自己调高德/腾讯 API 做逆地理编码——别指望它自动带地址
授权失败时,uni.authorize 不一定管用,得 fallback 到 openSetting
用户第一次点击拒绝,uni.authorize 会直接 fail,且后续再调也不会弹窗——这是微信的强制限制。这时候必须引导用户手动进设置页开启,否则定位永远不可用。
- 检测权限用
uni.getSetting,检查res.authSetting['scope.userLocation']是否为true - 若为
undefined或false,立刻调uni.showModal提示,并在 confirm 后调uni.openSetting -
uni.openSetting的 success 回调里,要再次检查authSetting,因为用户可能点了「取消」而非「允许」——别假设他一定开了
GCJ02 坐标传给高德 API 前,确认是否需要转 WGS84?
高德 Web API 默认接收 WGS84 坐标,但微信小程序返回的是 GCJ02(火星坐标)。直接传过去会导致逆地理编码返回错误区域,比如把上海定位成杭州郊区。
- 方案一:用高德小程序 SDK(
@amap/amap-wx),它内部自动处理坐标系转换,推荐 - 方案二:自己做 GCJ02 → WGS84 转换(有公开算法),但注意精度损失和合规风险
- 千万别用网上随手搜的「万能转换函数」,有些会把 GCJ02 当 WGS84 直接发请求,上线后大量用户地址错乱
最常被忽略的一点:高德 key 必须在小程序后台绑定当前 AppID,且开启「Web 服务」和「逆地理编码」权限——光有 key 但没开对应服务,接口返回 10005 错误,查半天才发现是控制台漏配。










