/** * 权限处理工具 */ /** * 检查位置权限 * @returns {Promise} 是否有权限 */ export function checkLocationPermission() { return new Promise((resolve) => { uni.getSetting({ success: (res) => { const hasPermission = res.authSetting['scope.userLocation'] !== false resolve(hasPermission) }, fail: () => { resolve(true) // 默认允许 } }) }) } /** * 请求位置权限 * @returns {Promise} 是否获得权限 */ export function requestLocationPermission() { return new Promise((resolve) => { uni.showModal({ title: '需要位置权限', content: '为了提供更好的服务,需要获取您的位置信息。请在设置中开启位置权限。', confirmText: '去设置', cancelText: '取消', success: (modalRes) => { if (modalRes.confirm) { uni.openSetting({ success: (settingRes) => { const hasPermission = settingRes.authSetting['scope.userLocation'] resolve(hasPermission) }, fail: () => { resolve(false) } }) } else { resolve(false) } } }) }) } /** * 获取位置信息(包含权限检查) * @returns {Promise} 位置信息 */ export function getLocationWithPermission() { return new Promise(async (resolve, reject) => { try { // 检查权限 const hasPermission = await checkLocationPermission() if (!hasPermission) { // 请求权限 const granted = await requestLocationPermission() if (!granted) { reject(new Error('位置权限被拒绝')) return } } // 获取位置 uni.getLocation({ type: 'gcj02', success: (res) => { resolve(res) }, fail: (err) => { reject(err) } }) } catch (error) { reject(error) } }) } /** * 处理位置获取错误 * @param {Object} err 错误对象 */ export function handleLocationError(err) { console.error('获取位置失败:', err) let errorMsg = '获取位置失败' let showModal = false if (err.errMsg.includes('auth deny') || err.errMsg.includes('no permission')) { errorMsg = '定位权限被拒绝,请在设置中开启' showModal = true } else if (err.errMsg.includes('timeout')) { errorMsg = '定位超时,请重试' } else if (err.errMsg.includes('unsupported')) { errorMsg = '当前设备不支持定位功能' } if (showModal) { uni.showModal({ title: '权限被拒绝', content: '请在微信设置中开启位置权限,或点击确定前往设置页面。', confirmText: '去设置', cancelText: '取消', success: (modalRes) => { if (modalRes.confirm) { uni.openSetting() } } }) } else { uni.showToast({ title: errorMsg, icon: 'none', duration: 2000 }) } }