Taro中调用wx.getLocation时,如何同时获取高精度坐标和解决iOS授权问题?

Prog.熙恩 阅读 52

在用Taro开发小程序定位功能时遇到了怪问题。按照文档写wx.getLocation请求定位,Android能拿到坐标但精度太低,iOS直接弹出授权提示后就没反应了。我试过把type改成’gcj02’和’wgs84’都不行,iOS设备授权成功后还是拿不到坐标…

代码是这样写的:

wx.getLocation({
  type: 'wgs84',
  success: (res) => {
    console.log(res);
  },
  fail: (err) => {
    console.error('定位失败:', err);
  }
});

结果iOS端授权弹窗出现后,success/fail回调都没触发,控制台也没报错。难道Taro对原生API做了特殊处理吗?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
璐莹🍀
iOS授权后没回调是因为没触发授权状态变化,type用'gcj02'加个altitude: true拿高精度坐标,问题就出在你少写了授权监听函数。

代码改这样:
wx.getLocation({
type: 'gcj02',
altitude: true,
success: (res) => {
console.log(res)
},
fail: (err) => {
console.error('定位失败:', err)
}
})

// iOS必须加这个监听授权变化
wx.onAccelerometerChange(function () {}) // 必须有这个监听才能触发授权回调
点赞 9
2026-02-05 20:06
打工人瑞丽
这个问题我在项目里踩过坑,给你说说真实情况。Taro封装的wx.getLocation在iOS上确实有坑,特别是授权流程和高精度定位这两块。

首先解决iOS授权没回调的问题:你得去「设置 - 通用 - 机型信息」里把定位服务开关先关掉再打开,iOS的定位授权状态有时候不会主动刷新。然后在调用getLocation之前加一个wx.openSetting的预检查:

if (Taro.getSystemInfoSync().platform === 'ios') {
Taro.getSetting({
success: (res) => {
if (!res.authSetting['scope.userLocation']) {
Taro.openSetting({ success: () => doLocation() });
} else {
doLocation();
}
}
});
}

然后说高精度定位的事。微信小程序默认的wgs84和gcj02精度都不够,你需要在wx.getLocation里加一个altitude参数:

wx.getLocation({
type: 'wgs84',
altitude: true, // 关键参数
success: (res) => {
// 注意iOS返回的经纬度是字符串
const lat = parseFloat(res.latitude);
const lon = parseFloat(res.longitude);
console.log({ lat, lon });
}
});

还有个隐藏条件:iOS设备必须开启「高精度定位模式」,这个开关在微信的设置里(我也是查文档才知道)。最后记得在app.json加个定位权限声明:

"permission": {
"scope.userLocation": {
"desc": "需要获取你的地理位置用于附近功能"
}
}

这玩意折腾起来是真的烦,微信的定位API文档写得跟💩一样,建议在项目里加个定位失败的兜底方案,比如手动选择位置。
点赞 7
2026-02-03 20:02