封装原因
项目中会出现像用户拿地理位置信息或其他权限的需求,但是我们无法控制用户的操作,如果用户按要求给了我们相关权限那么项目就可以正常走下去,但是如果用户误触或者点击了拒绝,会导致项目缺少了某些数据(例如位置参数)导致无法继续进行下去。
而微信小程序除隐私授权外其他的大部分授权都是拒绝过一次后就不会再弹窗询问授权了,这会导致用户拒绝了一次权限后就不再询问授权,会导致用户一直使用不了小程序,从而导致使用体验
我们当然可以处理权限拒绝的情况,但是每次都写重复的代码不符合我们的预期(摸鱼ing...),所以将处理逻辑封装起来,每次需要用时调用即可
代码
/*
获取用户授权(小程序专用)
@scopeName 授权名称 参考文档:https://uniapp.dcloud.net.cn/api/other/authorize.html#scope-%E5%88%97%E8%A1%A8
@tip 提示信息
@cb 回调函数
*/
export const getSetting = function (scopeName, tip = '请在设置中开启授权', cb) {
uni.getSetting({
success: (res) => {
if (res.authSetting[scopeName]) {
// 已经授权,调用回调函数
cb();
} else if (res.authSetting[scopeName] === false) {
// 用户已拒绝授权,引导用户到设置页面开启
uni.showModal({
title: '您未开启相关授权',
content: tip,
success: (res) => {
if (res.confirm) {
uni.openSetting({
success(settingRes) {
if (settingRes.authSetting[scopeName]) {
// 用户打开了授权,调用回调函数
cb();
}
},
});
}
},
});
} else {
// 首次使用,请求授权
uni.authorize({
scope: scopeName,
success() {
cb();
},
fail() {
// 首次使用,用户拒绝授权,引导用户到设置页面开启
uni.showModal({
title: '您未开启相关授权',
content: tip,
success: (res) => {
if (res.confirm) {
uni.openSetting({
success(settingRes) {
if (settingRes.authSetting[scopeName]) {
// 用户打开了授权,调用回调函数
cb();
}
},
});
}
},
});
},
});
}
},
});
};
使用示例
getSetting('scope.userLocation', '请在设置中开启地理位置授权', () => {
console.log('地理位置授权成功');
});