uniapp关于微信小程序和安卓APP授权验证封装

这里只考虑的小程序和安卓的授权,调取后会自动弹出授权弹窗,如果已拒绝授权则弹窗跳转到权限设置弹窗

安卓需要引入permission.js

// #ifdef APP-PLUS
import permision from "@/utils/permission.js";
// #endif

const isAuthorize = function(scopeStr, permissionToast) {
	return new Promise((resolve, reject) => {
		// #ifdef MP-WEIXIN
		// 微信小程序验证是否开启授权
		uni.getSetting({
			success(res) {
				// 如果权限未开启
				if (!res.authSetting[scopeStr]) {
					uni.authorize({
						scope: scopeStr,
						// 允许授权
						success() {
							resolve(true)
						},
						// 拒绝授权
						fail() {
							uni.showModal({
								title: permissionToast.title,
								content: permissionToast.content,
								confirmText: "开启授权",
								cancelText: '取消',
								success: (res2) => {
									if (res2.confirm) {
										// 开启授权设置
										uni.openSetting({
											success: (res3) => {
												//设置后返回,不管开没开
												// 有回调触发回调
												if(permissionToast.callback){
													permissionToast.callback();
												}
											}
										})
										reject(false)
									} else {
										reject(false)
										return false;
									}
								},
								fail: () => {
									reject(false)
								}
							})
						}
					})
				} else{
					// 已开启权限
					resolve(true)
				}
			}
		})
		// #endif
		// #ifdef APP-PLUS
		// APP权限验证
		permision.requestAndroidPermission(scopeStr).then(res=>{
			// 1已授权 2 未授权 -1 永久拒绝授权
			// 2会自动调取弹窗 -1必须手动调取弹窗
			if(res == -1) {
				// 永久拒绝授权相册
				uni.showModal({
					title:  permissionToast.title,
					content: permissionToast.content,
					confirmText: "开启权限",
					cancelText: '取消',
					success: (res) => {
						if (res.confirm) {
							permision.gotoAppPermissionSetting()
						} else {
							return false;
						}
					}
				})
			}
			resolve(res)
		}).catch(err=>{
			reject(false)
		})
		// #endif
	})
}

export default isAuthorize

使用

// #ifdef MP-WEIXIN
const toastData = {
	title: '请开启定位',
	content: '请允许使用您的定位',
	callback:()=>{
		//小程序需要设置完成后再次触发的方法如this.getLocation()
	}
}
isAuthorize('scope.userLocation',toastData ).then(() => {
	// 已开启权限
	
})
// #endif
// #ifdef APP-PLUS
isAuthorize('android.permission.ACCESS_FINE_LOCATION', toastData).then(res => {
	if (res == 1) {
		//已开启权限
	}
})
// #endif

微信小程序只需要将uni替换成wx就可以了
微信小程序权限码
安卓APP权限码

2023/5/31

注意上面的方法在使用成async await的情况下会出现问题,详细原因参考另一篇,于是进行了二次修改

// #ifdef APP-PLUS
import permision from "@/utils/permission.js";
// #endif

const isAuthorize = function(scopeStr, permissionToast, subscriptionsSetting = false) {
	return new Promise((resolve, reject) => {
		// #ifdef MP-WEIXIN
		// 微信小程序验证是否开启授权
		uni.getSetting({
			withSubscriptions: subscriptionsSetting,
			success(res) {
				if(subscriptionsSetting){
					// 订阅消息权限判断
					if(res.subscriptionsSetting&&!res.subscriptionsSetting.mainSwitch){
						uni.showModal({
							title: '温馨提示',
							content: '您没有开启订阅消息的权限,是否去设置?',
							confirmText: "去设置",
							cancelText: '取消',
							success: (res2) => {
								if (res2.confirm) {
									// 开启授权设置
									uni.openSetting({
										success: (res3) => {
											//设置后返回,不管开没开
										}
									})
								} else {
								}
							},
							fail: () => {
							}
						})
						resolve(true)
					}else{
						resolve(true)
					}
				}else if (!res.authSetting[scopeStr]) {
					//权限判断
					// 如果权限未开启
					uni.authorize({
						scope: scopeStr,
						// 允许授权
						success() {
							resolve(true)
						},
						// 拒绝授权
						fail() {
							uni.showModal({
								title: permissionToast.title,
								content: permissionToast.content,
								confirmText: "去设置",
								cancelText: '取消',
								success: (res2) => {
									if (res2.confirm) {
										// 开启授权设置
										uni.openSetting({
											success: (res3) => {
												//设置后返回,不管开没开
												// 有回调触发回调
												if(permissionToast.callback){
													permissionToast.callback();
												}
											}
										})
										resolve(false)
									} else {
										resolve(false)
									}
								},
								fail: () => {
									resolve(false)
								}
							})
							resolve(false)
						}
					})
				} else{
					// 已开启权限
					resolve(true)
				}
			},
			fail(err){
				resolve(false)
			}
		})
		// #endif
		// #ifdef APP-PLUS
		// APP权限验证
		permision.requestAndroidPermission(scopeStr).then(res=>{
			// 1已授权 2 未授权 -1 永久拒绝授权
			if(res == -1) {
				// 永久拒绝授权相册
				uni.showModal({
					title:  permissionToast.title,
					content: permissionToast.content,
					confirmText: "去设置",
					cancelText: '取消',
					success: (res) => {
						if (res.confirm) {
							permision.gotoAppPermissionSetting()
						} else {
							resolve(false)
						}
					}
				})
			}
			resolve(res)
		}).catch(err=>{
			resolve(false)
		})
		// #endif
	})
}

export default isAuthorize
//异步使用
const toastData = {
	title: '位置权限已关闭',
	content: '开启位置权限后,',
	callback: () => {
		this.getDefualtLocation()
	}
}
// #ifndef APP-PLUS
isAuthorize('scope.userLocation', toastData).then((res) => {
	// 已开启权限
	if(res){
		this.getDefualtLocation()
	}
})
// #endif
// #ifdef APP-PLUS
isAuthorize('android.permission.ACCESS_FINE_LOCATION', toastData, ).then(res => {
	if (res == 1) {
		this.getDefualtLocation()
	}
})


// 同步使用
// 鉴位置权限
async checkAuthor() {
	const toastData = {
		title: '位置权限已关闭',
		content: '开启位置权限后',
		callback: () => {}
	}
	// #ifndef APP-PLUS
	const res = await isAuthorize('scope.userLocation', toastData)
	return res
	// #endif
	// #ifdef APP-PLUS
	const res = await isAuthorize('android.permission.ACCESS_FINE_LOCATION', toastData)
	return res
	// #endif
}


async CreatOrder() {
	const authorRes = await this.checkAuthor();
	// #ifndef APP-PLUS
	if (!authorRes) {
		return;
	}
	// #endif
	// #ifdef APP-PLUS
	// 1已授权 2 未授权 -1 永久拒绝授权
	if (authorRes != 1) {
		return;
	};
	// #endif
}
// #endif
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值