129 lines
3.1 KiB
JavaScript
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
|
|
})
|
|
}
|
|
}
|