uni.getLocation 默认返回 WGS84 坐标,而高德地图强制要求 GCJ02 坐标系,偏差可达 500 米;必须显式传 type: 'gcj02'(HBuilderX ≥ 3.9.12),H5 端须用 AMap.Geolocation 插件。

uni.getLocation 为什么总拿不到高德要求的 GCJ02 坐标?
因为 uni.getLocation 默认返回的是 WGS84,而高德地图所有坐标系(包括地图渲染、距离计算、地理围栏)都基于国测局加密的 GCJ02。直接拿 WGS84 去算距离、画标记,偏差可能高达 500 米——打卡点明明在公司楼下,系统却提示“距打卡点 327 米”,用户当场怀疑人生。
实操建议:
-
uni.getLocation必须显式传type: 'gcj02',iOS 和 Android 均支持,但部分旧版 HBuilderX 可能忽略该参数,务必确认 CLI 版本 ≥ 3.9.12 - 不要依赖
uni.getSystemInfo判断平台再动态改 type,高德 SDK 内部对两种坐标系处理逻辑不同,混用会导致AMap.Geolocation插件定位失败或回调不触发 - H5 端无法使用
type: 'gcj02'(浏览器 API 不提供),必须走高德 JS API 的AMap.Geolocation插件,否则坐标系错位
manifest.json 里 maps 模块配了,为啥 Android 定位还是失败?
常见错误是只填了 Key,却漏掉了 Android 签名校验——高德会校验 APK 签名 SHA1 + 包名组合,哪怕开发时用调试包运行,也必须把 debug.keystore 的 SHA1 配进去,否则定位直接返回 fail permission denied 或静默失败。
实操建议:
- 用命令获取调试签名 SHA1:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android - 在高德控制台添加 Key 时,“打包签名”字段填完整 SHA1(含冒号,如
A1:B2:C3:...),不是 MD5,也不是 base64 编码结果 - Android 平台 Key 必须和
manifest.json中packagename完全一致(区分大小写),例如com.myapp.dev和com.myapp.Dev是两个不同应用
打卡距离判断不准,是不是要用 haversine 公式手动算?
不用。高德原生提供 AMap.GeometryUtil.distance,它内部已适配 GCJ02 坐标系下的球面距离计算,精度远高于通用 haversine(后者默认按 WGS84 计算,输入 GCJ02 坐标会引入额外误差)。
实操建议:
- 别自己写距离函数,直接调:
AMap.GeometryUtil.distance([lng1, lat1], [lng2, lat2]),单位是米 - 打卡半径建议设为 100–200 米:太小(如 10 米)受 GPS 漂移影响大;太大(如 500 米)失去打卡意义,且 iOS 后台定位精度骤降,容易误判
- 首次定位后别立刻判断距离——
uni.getLocation返回的可能是粗略位置(accuracy > 50m),应等AMap.Geolocation插件的complete回调后再取result.position,它带accuracy字段,可过滤掉低置信度结果
后台息屏后定位中断,插件选 Ba-LocationAMap 还是 @jv-uni/amap?
选 Ba-LocationAMap。它底层调用高德 Android/iOS 原生 SDK 的持续定位服务(startLocation + 前台服务/Background Modes),而 @jv-uni/amap 本质仍是 JS 层封装,退到后台后会被系统强制冻结,iOS 上几乎必然中断,Android 也仅在部分厂商白名单机型可用。
实操建议:
-
Ba-LocationAMap需单独申请高德「Android 后台定位」权限,在控制台 Key 配置页勾选「后台定位」服务,否则即使插件装了也报错location service not available - iOS 端必须在
manifest.json中开启usesBackgroundModes,并配置location和audio(后者用于保活,非真要播音频) - 插件启动后,定位回调频率由原生层控制,JS 层无法靠
setInterval模拟——试图用定时器反复调uni.getLocation只会加速被系统杀进程
最易被忽略的一点:高德 Key 的服务平台类型必须和实际使用场景严格匹配。Web 页面用 Web 端 Key,App 用 AppKey,小程序用小程序 Key——混用不仅定位失败,还可能触发风控限频,连带影响同账号下其他应用。










