微信小程序使用一些系统功能或者获取私人信息前都要申请权限,如果用户拒绝之后,该功能则无法使用,且再次点击也不会再申请权限,需要用户到设置内开启权限,今天就介绍一下微信小程序如何优雅的申请权限
首先,应该在调用需要权限的api的时候,在success中执行正确的逻辑,在fail里面处理没有获取权限后的处理。
我先定义一个获取地址位置信息的函数
var getLocation = function () {
return new Promise((resolve, reject) => {
// 先正常获取location
wxp.getLocation({ type: 'gcj02' }).then(res => {
resolve(res)
}).catch(err => {
if (err.errMsg == "getLocation:fail auth deny" || err.errMsg == "getLocation:fail authorize no response") {
// 权限问题
permission.location().then(res => {
// 获取权限成功重新获取location
wxp.getLocation({ type: 'gcj02' }).then(res => {
resolve(res)
})
}).catch(err => {
reject()
})
} else {
// 其他问题
reject()
}
})
})
}
为了不让代码缩进太多 我把 permission.location()
单独拆出来用来单独处理没有获取权限后的问题
var _apply = function (scope = 'scope.userLocation', title = '是否授权', content = '请去设置授权,否则将导致功能无法使用') {
return new Promise((resolve, reject) => {
wx.getSetting({
success: function (res) {
var scopes = res.authSetting;
if (!scopes[scope]) {
// 申请去设置授权
wx.showModal({
title: title,
content: content,
success: function (e) {
if (e.confirm) {
wx.openSetting({
success: function (data) {
if (data.authSetting[scope] === true) {
// 获取授权成功
resolve()
} else {
//授权失败
reject()
}
},
fail: function (err) {
// 打开设置失败
reject()
}
})
} else {
// 用户点了取消
reject()
}
}
})
} else {
resolve()
}
},
})
})
}
var location = function (title='需要获取您的地理位置', content='请去设置授权,否则将导致部分功能无法使用') {
return _apply('scope.userLocation', title, content)
}
export default {
location
}
如此以来,如果用户首次调用获取地理位置,如果他拒绝了,那么会提示用户是否去设置授权,确定后跳转设置,授权后返回继续执行后面的逻辑。
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/267