不知道大家在小程序授权的时候,会不会点击拒绝授权,然后第二次进来,哦豁。。授权框就在也出不来了,这种问题,在很多线上正在使用的小程序也会出现的问题,所以说,大家貌似都不太注意这方面问题,下面就是我对这问题的解决方法
很清楚能看到,我是将所有小程序要授权的scope,都放在Map类里,然后先 getSetting,获取当前小程序中所有被授权的模块(切记: res.authSetting是个对象,里面所有被授权的模块都是为true哦,意思就是未被授权或未申请授权的模块压根不会出现在res.authSetting中) ,如果拒绝授权,那么会将弹起一个model框,引导用户去系统里手动设置授权,uni.openSetting就是去手动授权的方式,否则的话,都会进入失败回调。
有趣的现象:
我在openSetting时,遇到这样一种,就是在进入系统手动设置时,一直在显示加载,貌似卡了,然后可能等了一分钟都没有加载出来,我就只有点击左上角退出,那么此时也是被判定为取消授权哦,进入失败回调
/**
* 授权综合逻辑
* @param {*} scope 权限代表
* @param {*} successCallback 成功回调
* @param {*} failCallback 失败回调
*/
export function pullAuth(scope, successCallback, failCallback) {
const map = new Map([
['scope.userInfo', '用户信息'],
['scope.userLocation', '地理位置'],
['scope.userLocationBackground', '后台定位'],
['scope.address', '通信地址'],
['scope.record', '录音功能'],
['scope.writePhotosAlbum', '保存到相册'],
['scope.camera', '摄像头'],
['scope.invoice', '获取发票'],
['scope.invoiceTitle', '发票抬头'],
['scope.werun', '微信运动步数'],
])
uni.getSetting({
success(res) {
if (!res.authSetting[scope]) {
uni.authorize({
scope,
success(){ // 允许授权
successCallback()
},
fail(){ // 拒绝授权
if (map.has(scope)) {
let word = map.get(scope)
uni.showModal({
content:`检测到您没打开${word}权限,是否去设置打开?`,
confirmText: "确认",
cancelText:'取消',
success: (res) => {
if(res.confirm){
uni.openSetting({
success: (res) => {
successCallback()
},
fail: () => {
failCallback()
},
})
}else{
failCallback()
}
}
})
} else {
uni.showToast({
title: '无此授权功能'
})
failCallback()
}
}
})
} else {
successCallback()
}
}
})
}
2.1、地理位置调用
放在onLoad是为了一进来就进行调用,当你之前已经授权过了,就会直接进入成功回调的,若是拒绝授权,那么第二次进来,会手动引导你去系统授权设置里
onLoad(() => {
pullAuth('scope.userLocation', firstSuccess, firstFail)
})
const firstSuccess = () => {
uni.showLoading({
title: '加载中'
})
uni.getLocation({
type: 'wgs84',
success: function (res) {
// res.longitude
// res.latitude
},
fail: function () {
uni.hideLoading()
uni.showToast({
title: '获取地址失败,将导致部分功能不可用',
icon:'none'
});
}
});
}
const firstFail = () => {
}
2.2、摄像头调用
我们一般都会单独写一个相机页面,要是你没有啥想法写这个页面,那么参考我的之前博客,链接为 uniapp + vue3微信小程序开发(2)活体人脸识别
我在这里是 当点击拍照时候,再开始进行授权判断,为什么呢? 因为camera组件的使用,会让在onLoad时候授权框弹出两次,这个就很奇怪,很明显,第一次弹出是因为camera初始化就必须要进行授权,第二次弹出是我们在onLoad周期要申请这个权限,所以我认为的解决方式就是不将pullAuth授权放在onLoad中,因为camera组件初始化必须要弹出授权框,所以即使我们在第一次弹出授权拒绝时,也可以在点击拍照时,在进行手动引导授权
// 详细代码请参考我上面发的链接 uniapp + vue3微信小程序开发(2)活体人脸识别
const startFace = () => {
pullAuth('scope.camera', firstSuccess, firstFail)
}
const firstSuccess = () => {
uni.showLoading({
title: '初始化...'
})
photoStatus()
if (!ctx.value) {
ctx.value = uni.createCameraContext();
}
setTimeout(() => {
uni.hideLoading()
takePhoto()
}, 500)
}
const firstFail = () => {
photoStatus(-1)
}