YZProjectCloud/yanzhu-ui-app/miniprogram/utils/locationPermission.js

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,
};