/** * 位置权限处理工具函数 */ /** * 检查并请求位置权限 * @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, };