uniapp + vue3微信小程序开发(5)授权

不知道大家在小程序授权的时候,会不会点击拒绝授权,然后第二次进来,哦豁。。授权框就在也出不来了,这种问题,在很多线上正在使用的小程序也会出现的问题,所以说,大家貌似都不太注意这方面问题,下面就是我对这问题的解决方法

1、授权方式

很清楚能看到,我是将所有小程序要授权的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、调用方式

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)
	}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值