uni.getLocation 大概率失败因权限、平台配置、坐标系未对齐:Android需manifest中勾选定位并生成对应权限,iOS需NSLocationWhenInUseUsageDescription非空,微信小程序需mp-weixin下补全permission和requiredPrivateInfos;调用前须用uni.getSetting检查权限,拒绝后需uni.openSetting跳转设置;H5需HTTPS及用户主动触发;type必须显式设为'gcj02'(大小写敏感),否则地图偏移;geocode仅App有效;真机调试才暴露真实限制,坐标系转换是必选项。

直接调 uni.getLocation 大概率拿不到坐标,不是代码写错了,而是权限、平台配置、坐标系三者没对齐。
manifest.json 权限配置漏一项就静默失败
Android 和 iOS 的权限声明位置不同,且微信小程序额外要求白名单字段,缺一不可:
- Android:在
manifest.json→ “Android 设置” → 勾选「定位」,确保生成的AndroidManifest.xml包含android.permission.ACCESS_FINE_LOCATION和android.permission.ACCESS_COARSE_LOCATION - iOS:在
manifest.json→ “iOS 设置” → 填写NSLocationWhenInUseUsageDescription(值不能为空字符串,建议写“查找附近门店”这类具体用途) - 微信小程序:必须在
mp-weixin节点下补全permission和requiredPrivateInfos,漏掉"getLocation"会导致真机报errCode: -1,控制台无提示
调用前必须检查权限状态,不能硬试
uni.getLocation 不会自动弹窗重试,用户一旦拒绝,后续调用只会进 fail 回调且不再触发授权弹窗:
- iOS / Android:先调
uni.getSetting,检查authSetting['scope.userLocation'] === true;若为false或undefined,改用uni.openSetting跳转系统设置页 - H5:不支持
uni.openSetting,只能靠try/catch捕获GeolocationPositionError,code 为 1 表示被拒,需提示用户手动开启浏览器定位 - 别在页面
onLoad里直接调 —— H5 和微信内嵌浏览器要求用户主动点击(比如按钮)才能触发定位,否则被拦截
type 参数必须显式指定为 'gcj02'
国内地图服务(高德、腾讯、百度)全部基于 GCJ-02 坐标系,uni.getLocation 默认返回 WGS84,直接传给地图组件或 uni.openLocation 会导致偏移几公里:
- 务必写
type: 'gcj02'(注意大小写,'GCJ02'无效) - 不传
type时,iOS 和 Android 行为不一致:iOS 多数返回 WGS84,Android 可能返回基站定位(误差数百米),不可依赖 -
geocode: true仅 App 端有效,且需在 manifest 中配置对应地图 SDK;H5 和小程序中该参数被忽略
真机调试才有效,H5 和模拟器有硬限制
开发阶段容易误判问题根源,因为很多限制只在真机上生效:
- H5 端必须 HTTPS(
http://localhost在 Chrome 89+ 会被拒绝),且需用户点击触发;Safari 更严格,甚至要求页面可见并聚焦 - 微信内置浏览器禁用原生
GeolocationAPI,实际走的是微信 JSSDK 的定位能力,精度低、响应慢,部分机型返回{ latitude: 0, longitude: 0 } - 模拟器/调试器里定位常能成功,但真机因系统级权限管控(如 iOS 后台定位开关、Android 12+ 运行时二次申请)会失败,务必用真机验证
最易被忽略的一点:坐标系转换不是可选项,是必选项。拿到 uni.getLocation 的结果后,别急着塞进地图组件或发请求,先确认 type: 'gcj02' 是否生效,再比对地图 SDK 文档是否要求其他格式(比如百度地图要 bd09ll)。偏差几百米的问题,90% 出在这里。


















