最近在弄一个小程序项目,处理用户授权地理位置信息的时候,发现用户在拒绝一次授权弹框之后,每次获取地理位置信息都是直接进入fail回调,并没有出现第二次弹框。
网上百度了一会,大致上解决办法是引导用户前往权限设置页面。基于这种办法,我将代码逻辑进行封装,具体如下:
判断用户是否已经授权
hasLocation: function () {
//第一次小程序会弹出一个授权框,拒绝之后不会再次弹出,直接进入fail回调,需引导用户进入设置页面打开授权
// 利用promise
return new Promise((resolve, reject) => {
wx.getSetting({
success: (res) => {
if(res.authSetting['scope.userLocation'] || typeof res.authSetting['scope.userLocation'] === 'undefined') {
resolve()
}else {
reject()
}
},
})
})
},
请求获取权限
getLocationAuth: function () {
return new Promise((resolve, reject) => {
wx.showModal({
title: '提示',
content: '是否允许小程序获取您当前位置',
success: res => {
if(res.confirm) {
wx.openSetting({
success: (res) => {
resolve()
},
fail: error => {
reject(error)
}
})
}
}
})
})
}
主要的逻辑实现
checkLocation: function (param) {
if (typeof param.callback !== 'function') {
param.callback = function () {
}
}
this.hasLocation().then(() => {
param.callback()
}).catch(() => {
this.getLocationAuth().then(() => {
param.callback()
}).catch(error => {
console.log('打开设置失败', error)
})
})
}
这里主要是实现判断用户是否授权,若是有或者是第一次授权,则直接回调,否则跳转到设置页面,不管用户有没有在设置页面开启权限,返回之后都是直接回调。可能还有不完善的地方是我没注意到的,还请大佬们指正