uni-app中chooseLocation在微信小程序需真机运行,且须配置正式AppID、检查并获取scope.userLocation权限;仅支持Promise调用,返回值需校验res.name,经纬度为字符串须转数字,调试失败多因配置或环境问题。

uni-app 中 chooseLocation 在微信小程序平台的实际调用条件
必须在真机上运行,且微信开发者工具模拟器不支持该 API;同时需要用户已授权 scope.userLocation,否则直接失败返回 fail auth deny 或 fail authorize no response。
常见错误是开发时只在 H5 或 App 端测试,误以为逻辑通了——但微信小程序要求:① manifest.json 中配置「微信小程序 AppID」;② 项目需以「微信小程序」为当前运行平台编译;③ uni.getSetting 检查权限后,未触发 uni.authorize 就直接调用 chooseLocation,导致静默失败。
- 务必先调用
uni.getSetting判断scope.userLocation是否为granted - 若为
denied,需主动调用uni.authorize({scope: 'scope.userLocation'})引导授权(注意:iOS 微信 8.0.30+ 后,authorize对位置权限不再弹窗,需引导用户手动进入设置) - 若为
unauthorized,可直接调用chooseLocation,微信会自动拉起位置选择界面并附带授权请求
微信小程序平台下 chooseLocation 的参数限制与行为差异
uni-app 的 chooseLocation 在微信小程序中实际映射为微信原生的 wx.chooseLocation,因此不支持 success/fail 回调写法(即不能传对象参数),仅支持 Promise 风格;且所有参数均为可选,但微信侧对 address 和 latitude/longitude 有隐式约束:
- 若传了
latitude和longitude,地图会默认居中到该坐标点(精度需为小数点后 6 位,多于或少于都会被截断或报错) -
address仅作为初始搜索关键词,不是地址补全字段;若填了但无匹配结果,地图仍打开,只是搜索框为空 - 微信不支持自定义
scale(缩放级别),固定为 16;也不支持禁用地图控件、隐藏 POI 等定制化配置 - 调用后若用户取消或点击左上角返回,Promise resolve 返回空对象
{},不是 reject —— 这点和文档描述不符,实测必须靠判断name字段是否存在来区分是否真实选择了地址
如何安全获取并校验 chooseLocation 返回值
微信返回的地址对象字段名与高德/百度不一致,且存在兼容性风险:比如 address 字段在部分低版本 iOS 微信中可能为空,而 name + address 拼接才是完整地址;更关键的是,latitude 和 longitude 是字符串而非数字,直接参与计算会出错。
推荐统一做类型归一和空值兜底:
uni.chooseLocation().then(res => {
if (!res.name) {
console.warn('用户未选择地址,取消操作');
return;
}
const lat = parseFloat(res.latitude) || 0;
const lng = parseFloat(res.longitude) || 0;
const fullAddress = res.name + (res.address || '');
// 后续可传给后端或存入表单
});
- 永远检查
res.name是否存在,而不是res.latitude—— 用户可能点了某个 POI 但没加载完地址详情,此时latitude有值但address为空 - 不要依赖
res.address单独使用,它只是街道级补充,不含 POI 名称 - 微信返回的经纬度精度不稳定,如需高精度定位,应配合
uni.getLocation再次获取
调试时常见的「白屏」「卡死」「无响应」原因
不是代码写错了,而是环境或配置问题。最常踩的三个坑:
- manifest.json 中「微信小程序」AppID 为空或填写了测试号 AppID(测试号不支持
chooseLocation)—— 必须是已认证主体的小程序正式 AppID - 微信开发者工具开启了「不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书」,但没勾选「启用位置服务模拟」,导致地图初始化失败白屏
- 页面
onLoad中立即调用chooseLocation,而此时页面尚未完成渲染(尤其在使用uni.navigateTo带参数跳转后),微信会拒绝调用并静默失败;建议加个setTimeout延迟 300ms 或监听onReady后再触发
真机调试时,如果点击按钮毫无反应,优先看控制台是否输出 fail system error —— 这基本等于 manifest 配置或 AppID 有问题,和代码无关。



















