148 lines
4.6 KiB
JavaScript
148 lines
4.6 KiB
JavaScript
/**
|
|
* 位置权限处理工具函数
|
|
*/
|
|
|
|
/**
|
|
* 检查并请求位置权限
|
|
* @param {Function} successCallback - 获取位置成功回调
|
|
* @param {Function} failCallback - 获取位置失败回调
|
|
*/
|
|
function checkAndRequestLocationPermission(successCallback, failCallback) {
|
|
wx.getLocation({
|
|
type: "gcj02",
|
|
success: (res) => {
|
|
successCallback && successCallback(res);
|
|
},
|
|
fail: (err) => {
|
|
console.error("获取位置失败", err);
|
|
|
|
// 分析错误原因
|
|
let errMsg = "获取位置失败";
|
|
if (err.errMsg && err.errMsg.includes("auth deny")) {
|
|
errMsg = "未授权位置权限";
|
|
} else if (err.errMsg && err.errMsg.includes("auth denied")) {
|
|
errMsg = "位置权限被拒绝";
|
|
} else if (
|
|
err.errMsg &&
|
|
err.errMsg.includes("fail system permission denied")
|
|
) {
|
|
errMsg = "系统未开启定位服务";
|
|
} else if (
|
|
err.errMsg &&
|
|
err.errMsg.includes("fail url not in domain list")
|
|
) {
|
|
errMsg = "请求域名未配置,请联系管理员";
|
|
}
|
|
|
|
// 显示详细错误信息和解决方案
|
|
wx.showModal({
|
|
title: "位置权限申请",
|
|
content: `${errMsg},需要获取您的位置信息。请确保:
|
|
1. 已授权位置权限
|
|
2. 手机定位服务已开启
|
|
3. 在设置中开启位置权限
|
|
4. 使用最新版本小程序`,
|
|
showCancel: true,
|
|
confirmText: "去设置",
|
|
cancelText: "稍后再说",
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
wx.openSetting({
|
|
success: (setting) => {
|
|
if (setting.authSetting["scope.userLocation"]) {
|
|
// 用户开启了权限,重新获取位置
|
|
checkAndRequestLocationPermission(
|
|
successCallback,
|
|
failCallback
|
|
);
|
|
} else {
|
|
failCallback && failCallback(err);
|
|
}
|
|
},
|
|
fail: (error) => {
|
|
console.error("打开设置失败", error);
|
|
wx.showToast({
|
|
title: "打开设置失败",
|
|
icon: "none",
|
|
});
|
|
failCallback && failCallback(error);
|
|
},
|
|
});
|
|
} else {
|
|
failCallback && failCallback(err);
|
|
}
|
|
},
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取当前位置并返回详细地址信息
|
|
* @param {Function} successCallback - 成功回调,包含位置和地址信息
|
|
* @param {Function} failCallback - 失败回调
|
|
*/
|
|
function getCurrentLocationWithAddress(successCallback, failCallback) {
|
|
checkAndRequestLocationPermission(
|
|
(locationRes) => {
|
|
// 获取位置成功,继续获取地址信息
|
|
const { latitude, longitude } = locationRes;
|
|
|
|
// 使用腾讯地图API进行逆地理编码
|
|
const apiKey = "NUQBZ-UIYCW-H7GRI-YXOXA-WNZB7-IGFLY";
|
|
const url = `https://apis.map.qq.com/ws/geocoder/v1/?location=${latitude},${longitude}&key=${apiKey}&get_poi=0`;
|
|
|
|
wx.request({
|
|
url: url,
|
|
success: (res) => {
|
|
if (res.data.status === 0) {
|
|
const address = res.data.result.address || "获取地址失败";
|
|
successCallback &&
|
|
successCallback({
|
|
...locationRes,
|
|
address: address,
|
|
});
|
|
} else {
|
|
// 地址获取失败,但仍返回位置信息
|
|
successCallback &&
|
|
successCallback({
|
|
...locationRes,
|
|
address: "地址获取失败",
|
|
});
|
|
}
|
|
},
|
|
fail: (err) => {
|
|
console.error("获取地址信息失败", err);
|
|
// 检查是否是域名问题
|
|
if (
|
|
err.errMsg &&
|
|
err.errMsg.includes("fail url not in domain list")
|
|
) {
|
|
wx.showModal({
|
|
title: "配置错误",
|
|
content:
|
|
"请求域名未在后台配置,请联系管理员配置 https://apis.map.qq.com 域名",
|
|
showCancel: false,
|
|
confirmText: "我知道了",
|
|
});
|
|
}
|
|
// 地址获取失败,但仍返回位置信息
|
|
successCallback &&
|
|
successCallback({
|
|
...locationRes,
|
|
address: "地址获取失败",
|
|
});
|
|
},
|
|
});
|
|
},
|
|
(err) => {
|
|
failCallback && failCallback(err);
|
|
}
|
|
);
|
|
}
|
|
|
|
module.exports = {
|
|
checkAndRequestLocationPermission: checkAndRequestLocationPermission,
|
|
getCurrentLocationWithAddress: getCurrentLocationWithAddress,
|
|
};
|