HomeLease/utils/permission.js
2025-08-19 09:27:16 +08:00

129 lines
3.1 KiB
JavaScript

/**
* 权限处理工具
*/
/**
* 检查位置权限
* @returns {Promise<boolean>} 是否有权限
*/
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<boolean>} 是否获得权限
*/
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<Object>} 位置信息
*/
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
// 安全地检查错误信息
const errMsg = err?.errMsg || err?.message || ''
if (errMsg.includes('auth deny') || errMsg.includes('no permission')) {
errorMsg = '定位权限被拒绝,请在设置中开启'
showModal = true
} else if (errMsg.includes('timeout')) {
errorMsg = '定位超时,请重试'
} else if (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
})
}
}