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

利用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)

参数说明:

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

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

参数说明

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

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

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

你可能感兴趣的:(uni-app,web,app,reactnative,uni-app,node.js)