uni-app解决权限问题,引导用户跳转至设置界面

周奇文
2023-12-01

利用Native.js获取当前App的授权状态,可打开App的授权设置界面,这里使用已封装好的permission.js插件,实现提示用户授权情况及设置功能。

插件下载地址:App权限判断和提示 - DCloud 插件市场

一、使用方法

1.下载插件并存放到项目目录下,比如:js_sdk/wa-permission/permisson.js

2.在页面中引入js模块:

import permission from '@/js_jdk/wa-permission/permission.js'

3.调用模块的方法

//判断IOS上是否给予位置权限,有权限返回true,否则返回false
permission.judgeIosPermission('location');        

二、IOS设备上当前App是否有某项权限

方法1:Bool permission.judgeIosPermission(String permissionID)

参数说明:

参数名类型必填说明
permissionIDStringios权限名称,值域清单如下列表

permissionID值域清单

参数名说明 
location位置
push推送(限IOS,注意Android上推送并不是一个权限)
camera摄像头
photoLibrary相册
record麦克风
contact通讯录
calendar日历
memo备忘录

示例:

//判断IOS上是否给予位置权限,有权限返回true,否则返回false
permission.judgeIosPermission('location');        

三、Android设备上当前App是否有某个权限

方法2:await Number permission.requestAndroidPermission(String permissionID)

注意:Android是动态权限,请求权限状态时会触发弹框访问是否赋权(如果已经同意或永久禁止则不会访问),所以必须使用异步方式来处理)

参数说明

参数名类型必填说明
permissionIDStringAndroid权限名称,值域清单如下表

permissionId值域清单

参数名说明
android.permission.ACCESS_FINE_LOCATION位置权限
android.permission.ACCESS_COARSE_LOCATION模糊位置权限(蓝牙\ble依赖)
android.permission.CAMERA摄像头权限
android.permission.READ_EXTERNAL_STORAGE外部存储(含相册)读取权限
android.permission.WRITE_EXTERNAL_STORAGE外部存储(含相册)定入权限
android.permission.RECORD_AUDIO麦克风权限
android.permission.READ_CONTACTS通讯录读取权限
android.permission.WRITE_CONTACTS通讯录写入权限 
android.permission.READ_CALENDAR日历读取权限
android.permission.WRITE_CALENDAR日历写入权限
android.permission.READ_SMS短信读取权限
android.permission.SEND_SMS短信发送权限
android.permission.RECEIVE_SMS接收新短信权限
android.permission.READ_PHONE_STATE获取手机识别码等信息权限
android.permission.CALL_PHONE拨打电话权限
android.permission.READ_CALL_LOG获取通话记录权限

这里支持Android所有android.permission的值,更多值可参考Android开发文档

返回值值域说明

permission.requestAndroidPermission(permissionID) 返回值为数字,包括-1、0、1这三个值。

返回值说明
1已获取授权
0未获取授权
-1被永久拒绝授权

示例:

// vue的method里编写如下代码
async requestAndroidPermission(permissionID) {
    var result = await permission.requestAndroidPermission(permissionID)
    var strStatus
    if (result == 1) {
        strStatus = "已获得授权"
    } else if (result == 0) {
        strStatus = "未获得授权"
    } else {
        strStatus = "被永久拒绝权限"
    }
    uni.showModal({
        content: permissionID + strStatus,
        showCancel: false
    });
}

四、当前App的权限设置界面打开,可用于引导用户赋权。

内部已封装,不必区分IOS和Android。

示例代码:

permission.gotoAppPermissionSetting()

注:IOS上如果没有调用过的权限,不会出现在权限设置界面。Android碎版化严重,直接打开了App的设置界面。

五、获取当前手机是否开启或关闭了定位服务

内部已封装,不必区分IOS和Android

返回值说明
true开启
false关闭

示例:

//返回true或false
permission.checkSystemEnableLocation() 

六、扩展阅读

Native.js是用js调用原生API的一种写法,示例如下:

判断定位权限是否开启以及手机自身的位置服务是否被关闭

var cllocationManger = plus.ios.import("CLLocationManager");
var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
console.log("enable:" + enable);
console.log("status:" + status);
if (enable && status != 2) {
    console.log("手机系统的定位已经打开且App已经获得定位权限");
} else {
    console.log("手机系统的定位没有打开或App没有获得定位权限");
}
plus.ios.deleteObject(cllocationManger);

七、相关权限判断与开启示例

1.判断是否有拨打电话权限,示例如下:

import permission from "@/js_sdk/wa-permission/permission.js"

//检查是否开启通讯录服务
export const checkContect = () => {
	return new Promise((resolve, reject) => {
		permission.requestAndroidPermission('android.permission.CALL_PHONE').then(res => {
			if(res==1){
				resolve();
			}else if(res == 0){
				uni.showModal({
					title: '提示',
					content: '被永久拒绝授权, 请打开拨打电话权限',
					success() {
						permission.gotoAppPermissionSetting();
					}
				});
				reject();
			}else if(res == -1){
				uni.showModal({
					title: '提示',
					content: '未获取授权, 请打开拨打电话权限',
					success() {
						permission.gotoAppPermissionSetting();
					}
				});
				reject();
			}
		}).catch(() => {
			uni.showModal({
				title: '提示',
				content: '请打开拨打电话权限',
				success() {
					permission.gotoAppPermissionSetting();
				}
			});
			reject();
		});
	});
}


//通过import将checkContect函数引入调用页面,调用方法如下
// #ifdef APP-PLUS
checkContect().then(() => {
    uni.makePhoneCall({
        phoneNumber: '手机或座机号码'
    }); 
});
// #endif

2.检查是否开启位置信息服务

import permission from "@/js_sdk/wa-permission/permission.js"

// 检查是否开启位置信息服务
export const checkOpenService = () => {
	let result = permission.checkSystemEnableLocation();
	if(!result) {
		uni.showModal({
			title: '提示',
			content: '请打开定位服务功能',
			showCancel: false,
			success() {
				var main = plus.android.runtimeMainActivity();
				var Intent = plus.android.importClass('android.content.Intent');
				var Settings = plus.android.importClass('android.provider.Settings');
				var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
				main.startActivity(intent); // 打开系统设置GPS服务页面
			}
		});
	}else {
		console.log('已开启定位服务功能');
	}
}


//通过import将checkOpenService函数名引入调用页,示例如下
// #ifdef APP-PLUS
let permissionStatus = checkOpenPermission();
if(!permissionStatus){
	return false;
}
// #endif

其他权限判断与开启方法,可参考以上示例

 类似资料: