高德Key必须分平台配置,Android校验包名+SHA1、iOS校验Bundle ID,共用同一字符串会导致任一平台定位失败;manifest.json需显式分开配置,且必须启用Maps模块并勾选高德地图。

uni-app里高德Key必须分平台配,不能共用一个字符串
Android 和 iOS 的高德 Key 本质是两套校验逻辑:Android 校验包名 + SHA1,iOS 校验 Bundle ID。哪怕你填同一个字符串,在任一平台都会直接失败,uni.getLocation 返回 errCode: 10002 或静默无响应。
manifest.json 中必须显式分开写,漏掉任一平台配置,对应设备就拿不到定位:
"app-plus": {
"distribute": {
"android": {
"maps": { "AMap": "your-android-key-here" },
"packageName": "com.example.app"
},
"ios": {
"maps": { "AMap": "your-ios-key-here" },
"bundleIdentifier": "com.example.app"
}
}
}
- Android Key 申请时,
keytool -list -v -keystore your-release-key.keystore得到的 SHA1 必须和控制台填写的一致;调试用的 debug.keystore 默认路径在~/.android/debug.keystore - iOS Key 申请时,
bundleIdentifier必须和 Xcode 工程中设置的完全一致(大小写敏感),且需在高德控制台勾选「iOS 平台」 - HBuilderX 云打包时,如果用了自定义证书,务必用该证书重新生成 SHA1 填到高德控制台,否则真机测试通过、云打包后失效
uni.getLocation(type: 'gcj02') 才能和高德地图坐标对齐
高德地图 SDK 内部使用国测局加密坐标系(GCJ-02),而 uni.getLocation 默认返回 WGS84(GPS 原始坐标)。如果你用 type: 'wgs84' 拿到的经纬度直接传给 <map> 组件,标记点会偏移 500 米以上——这不是精度问题,是坐标系错配。
正确做法是强制指定 type: 'gcj02':
uni.getLocation({
type: 'gcj02',
success(res) {
console.log(res.latitude, res.longitude) // 这组值可直接喂给 <map> 的 latitude/longitude
},
fail(err) {
// 常见 err.errMsg 包含 "permission denied" 或 "location not enabled"
}
})
- 注意:H5 端不支持
type: 'gcj02',它只认wgs84;若需多端兼容,得在 H5 单独调用高德 JSAPI 的AMap.Geolocation -
type: 'gcj02'在 app-plus 环境下才有效,uni.getSystemInfoSync().platform可做运行时判断 - 部分 Android 旧机型(如 MIUI 12 以下)可能因系统限制返回空对象,建议加 timeout 和重试逻辑
manifest.json 里 Maps 模块没开,uni.getLocation 会直接 fallback 到系统定位
很多人以为只要写了 Key 就行,其实 uni.getLocation 在 app-plus 下依赖原生地图 SDK 提供的定位能力。如果 manifest.json 里没启用高德地图模块,它就会退化成调用系统级 CLLocationManager(iOS)或 FusedLocationProvider(Android),结果就是:坐标不准、无地址描述、无法触发高德逆地理编码。
高德地图 API 调用工具,返回原始 JSON 数据。Use when users ask about 天气、地址、坐标、周边、路线、导航、打车、行程 in China. Commands: weather, geo, regeo, search, around, detail, route, distance,...
必须手动勾选:
在 HBuilderX → 项目 → manifest.json → 「App模块配置」→ 找到「Maps」→ 勾选「高德地图」→ 保存并重新运行
- 勾选后,manifest.json 源码视图会自动补上
"modules": { "maps": true }字段,别手动删 - 如果已勾选但依然无效,检查是否误勾了「百度地图」或「腾讯地图」——三者互斥,只能开一个
- 真机调试时,首次运行会弹系统权限框;若用户点了“不允许”,后续再调
uni.getLocation会直接进 fail 回调,且不再弹窗,需引导用户去系统设置里手动开启
Android 打包后定位失败,大概率是签名证书没对上
开发时用 HBuilderX 自带的调试基座能过,但云打包或本地打包 APK 后定位失败,90% 是因为 Android Key 绑定的 SHA1 和实际打包用的签名证书不一致。高德不会报明确错误,只返回 errCode: 10001(KEY 非法)或静默失败。
验证方式很简单:
keytool -list -v -keystore your-signed-release.keystore -alias your-alias-name
- 把输出的 SHA1 复制,粘贴到高德控制台对应应用的 Android Key 配置页,确认完全一致(注意冒号分隔和大小写)
- 云打包时,如果选了「使用自有证书」,就必须用那个证书的 SHA1;如果选「使用 DCloud 证书」,则要用 DCloud 控制台里显示的 SHA1
- debug 和 release 必须用两套 Key——开发阶段用 debug.keystore 的 SHA1 申请一个 Key,上线前再换 release 的 SHA1 申请另一个,避免来回切换出错
最麻烦的点往往藏在细节里:比如 iOS 的 Bundle ID 多了个空格,Android 的包名少了个字母,或者高德控制台填 SHA1 时复制进了不可见字符。这些地方不报错,但就是不动。


















