该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
问题根源
微信小程序在 2023-05 之后的基础库里,对 getLocation 的调用做了更严格的校验:
- 必须在 app.json(uni-app 对应 manifest.json → mp-weixin 节点)里声明 requiredPrivateInfos;
- 首次调用前必须让用户在设置页里打开“使用地理位置”开关,仅靠 authorize 弹窗已不够;
- 如果用户曾经拒绝过,authorize 会直接走 fail,不会再弹窗,此时需要引导用户去设置页手动打开。
你看到的报错
showModal:fail parameter error: parameter.content should be String instead of Error
并不是 getLocation 本身抛出的,而是你在 fail / catch 里把 Error 对象直接塞给了 uni.showModal 的 content 字段导致的。只要把错误转成字符串即可消除这个报错,但真正导致定位失败的仍是权限或声明问题。
一步一步排查与修正
-
manifest.json(mp-weixin 节点)
{
"mp-weixin": {
"appid": "你的appid",
"requiredPrivateInfos": ["getLocation"],
"permission": {
"scope.userLocation": {
"desc": "你的地理位置将用于小程序打卡功能"
}
}
}
}
修改后重新发行(或删除 dist/build/mp-weixin 重新运行)。
-
调用流程
// 先判断是否已经授权
const setting = await uni.getSetting();
if (!setting.authSetting['scope.userLocation']) {
// 用户从未授权过,先弹授权框
try {
await uni.authorize({ scope: 'scope.userLocation' });
} catch (e) {
// 用户点了拒绝,引导去设置页
uni.showModal({
title: '需要位置权限',
content: '请在设置中打开“使用地理位置”开关',
showCancel: false,
success: () => uni.openSetting()
});
return;
}
}
// 真正取位置
try {
const { latitude, longitude } = await uni.getLocation({ type: 'wgs84' });
console.log(latitude, longitude);
} catch (e) {
uni.showToast({ title: '定位失败:' + e.errMsg, icon: 'none' });
}
3. 真机调试
- 微信开发者工具 → 详情 → 本地设置 → 勾选“不校验合法域名、web-view 业务域名、TLS 版本以及 HTTPS 证书”仅用于本地调试,不影响真机。
- 真机首次进入页面时,如果没有出现系统授权弹窗,直接提示“定位失败:getLocation:fail auth deny”,说明之前已经拒绝过,必须走 openSetting 让用户手动开。
- 如果提示“getLocation:fail system permission denied”,则是手机系统里微信的定位权限被关闭,需要到系统设置 → 应用 → 微信 → 权限 → 位置信息 → 允许。
4. 常见坑
- 用 uni.authorize 之前不要先调用 getLocation,否则微信会立即返回 fail,导致后续 authorize 也失效。
- 不要在 onLaunch 里立即调用 getLocation,建议放在真正需要定位的页面里。
- 基础库低于 2.17.0 的老微信客户端不支持 requiredPrivateInfos,需要提示用户升级微信。
按以上步骤处理后,定位即可正常返回 wgs84 坐标。
1 个回复
Ask小助手 - Ask社区AI助手
问题根源
微信小程序在 2023-05 之后的基础库里,对 getLocation 的调用做了更严格的校验:
你看到的报错
并不是 getLocation 本身抛出的,而是你在 fail / catch 里把 Error 对象直接塞给了 uni.showModal 的 content 字段导致的。只要把错误转成字符串即可消除这个报错,但真正导致定位失败的仍是权限或声明问题。
一步一步排查与修正
manifest.json(mp-weixin 节点)
修改后重新发行(或删除 dist/build/mp-weixin 重新运行)。
调用流程
// 真正取位置
try {
const { latitude, longitude } = await uni.getLocation({ type: 'wgs84' });
console.log(latitude, longitude);
} catch (e) {
uni.showToast({ title: '定位失败:' + e.errMsg, icon: 'none' });
}
要回复问题请先登录或注册
公告
更多>相关问题