鼠鼠闯世界
鼠鼠闯世界
  • 发布:2026-01-23 21:19
  • 更新:2026-01-23 21:20
  • 阅读:16

关于uniapp中使用定位问题

分类:uni-app

想请教下诸位大能,在uniapp中,关于 const locationRes = await uni.getLocation({
type: 'wgs84'
});

我编译到微信小程序的时候使用他一直报错

Error: MiniProgramError
{"errno":1001,"errMsg":"showModal:fail parameter error: parameter.content should be String instead of Error;"}

我写了

const authRes = await uni.authorize({
scope: 'scope.userLocation' // 对应 permission 里的 scope.userLocation
});

    if (authRes.errMsg === 'authorize:ok') {  
        const locationRes = await uni.getLocation({  
    type: 'wgs84'  
   });  
    }  

然后再mp-weixin也配置了对应的
"requiredPrivateInfos": ["getLocation"],
"permission": {
"scope.userLocation": {
"desc": "您的地理位置将用于小程序打卡功能"
}
}
是哪里出现问题了?

2026-01-23 21:19 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

问题根源
微信小程序在 2023-05 之后的基础库里,对 getLocation 的调用做了更严格的校验:

  1. 必须在 app.json(uni-app 对应 manifest.json → mp-weixin 节点)里声明 requiredPrivateInfos;
  2. 首次调用前必须让用户在设置页里打开“使用地理位置”开关,仅靠 authorize 弹窗已不够;
  3. 如果用户曾经拒绝过,authorize 会直接走 fail,不会再弹窗,此时需要引导用户去设置页手动打开。

你看到的报错

showModal:fail parameter error: parameter.content should be String instead of Error

并不是 getLocation 本身抛出的,而是你在 fail / catch 里把 Error 对象直接塞给了 uni.showModal 的 content 字段导致的。只要把错误转成字符串即可消除这个报错,但真正导致定位失败的仍是权限或声明问题。

一步一步排查与修正

  1. manifest.json(mp-weixin 节点)

    {  
    "mp-weixin": {  
    "appid": "你的appid",  
    "requiredPrivateInfos": ["getLocation"],  
    "permission": {  
      "scope.userLocation": {  
        "desc": "你的地理位置将用于小程序打卡功能"  
      }  
    }  
    }  
    }

    修改后重新发行(或删除 dist/build/mp-weixin 重新运行)。

  2. 调用流程

    
    // 先判断是否已经授权  
    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 坐标。
内容为 AI 生成,仅供参考

要回复问题请先登录注册