必须通过逆地理编码获取adcode:uni.getLocation仅返回经纬度,需调用高德/腾讯API;配置上manifest.json需补全权限字段,type设为'gcj02';高德API需绑定域名或AppID,腾讯更适配弱网与政务场景;res.address和geocode:true在小程序/H5无效。

直接用 uni.getLocation 拿不到城市行政区划(adcode),它只返回经纬度;必须配合逆地理编码服务,且高德/腾讯的返回结构、坐标系要求、权限配置和跨域限制各不相同——选错方案,真机上连 fail 回调都不触发。
uni.getLocation 调用静默失败?先查 manifest.json 两处硬性配置
微信小程序和 iOS 真机上,uni.getLocation 不报错也不进 success/fail,基本就是 manifest.json 漏了关键字段:
-
mp-weixin.requiredPrivateInfos必须显式包含["getLocation"](HBuilderX 可视化界面不会自动加) -
mp-weixin.permission.scope.userLocation.desc必须是非空、有业务语义的字符串,比如"用于推荐附近门店",不能是"获取位置"或纯空格 - iOS 还需在
manifest.json → "ios" → "usingPrivacy" → "NSLocationWhenInUseUsageDescription"填描述 -
type参数必须指定为'gcj02':微信返回的坐标默认是 GCJ02,若设成'wgs84'或不填,后续调高德/腾讯 API 时地址偏移明显,adcode 错误率飙升
前端直连高德 Web API 拿 adcode 最快,但 key 绑定和域名限制极严
高德 regeo 接口返回的 adcode 是国家统计局标准 6 位码(如北京朝阳区是 110105),但它的 key 必须在高德开放平台单独开通「Web 服务」并绑定对应环境:
- H5 端:key 必须绑定你部署的域名(支持泛解析,但
localhost和 IP 地址需单独添加) - 微信小程序:key 必须绑定小程序 AppID,且只认「小程序 SDK」类型,勾选「Web 服务」没用
- 请求 URL 中
location参数顺序是"经,纬",即${res.longitude},${res.latitude},反了会返回错误地址 - 别用
extensions=all:返回数据大、慢,extensions=base已含adcode、city、province
腾讯地图逆解析更适配政务或区域统计类场景
腾讯的 geocoder 接口返回的 adcode 同样符合国标,且对模糊定位(如 wx.getFuzzyLocation)兼容更好,但要注意:
- 腾讯 WebService 的 key 需在控制台开启「逆地址解析」权限,并填写上线 IP(开发阶段可填
0.0.0.0或本地出口 IP) - 它不校验 referer,H5 端无 CORS 风险;但微信小程序端仍需绑定 AppID,且 key 类型选「小程序」而非「JS API」
- 返回结构中
result.ad_info.adcode是标准编码,result.address_component.city是城市名,注意字段层级比高德深一层 - 腾讯对室内、弱网环境下的 fallback 更友好,比如 GPS 失效时能退到基站定位并仍返回可用 adcode
别碰 res.address,也别信 geocode:true
uni.getLocation 成功回调里的 res.address 字段永远是 undefined;geocode:true 参数仅在 App 端生效,H5 和小程序完全忽略——这两点文档写得隐晦,但实测 100% 不工作。
真正要拿城市行政区划,只有两条路:要么用 uni.chooseLocation(打开系统地图让用户选,返回带 address 字符串的对象,再用正则提取省市区),要么走服务端代理逆解析(避免 key 泄露、统一处理 infocode: 10007 等错误、加缓存)。前者体验重但稳定,后者轻量但多一跳网络请求——具体选哪个,取决于你是否允许用户手动干预定位结果。


















