Taro中调用wx.getLocation时,如何同时获取高精度坐标和解决iOS授权问题?
在用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做了特殊处理吗?
代码改这样:
首先解决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文档写得跟💩一样,建议在项目里加个定位失败的兜底方案,比如手动选择位置。