YonBuilder移动开发应用动态权限功能开发教程

时间:2022-11-11 16:27:42

背景概述

当前用户个人隐私信息泄漏的问题已经越来越严重了,这种现象导致国内外对于用户隐私的保护越来越重视。在移动端的应用开发领域,如果你的应用程序未使用动态权限方式去获取用户的隐私权限,你的应用将无法上架GooglePlay及国内的各大应用市场。所以对于一款标准的移动端商业app,动态权限功能已经成为了必不可少的标配功能。

本文主要介绍如何使用YonBuilder移动开发技术,去开发实现移动端的动态权限功能。

API介绍 YonBuilder 移动开发统一了android和iOS两个平台的动态权限操作,提供了两个API函数来支持动态权限的开发:

hasPermission : 用来判断应用是否已获取了某个(或某几个)应用权限的用户授权

YonBuilder移动开发应用动态权限功能开发教程

requestPermission:使用交互弹窗的方式,来向用户申请相关的应用权限

YonBuilder移动开发应用动态权限功能开发教程

更多的API对象介绍,可访问​​https://docs.apicloud.com/Client-API/api查看。​

实现思路

大体的实现思路就是先使用hasPermission去检测权限,获取检测结果后,对权限检查结果进行判断。对于没有获取到的权限,再调用requestPermission函数去进行动态申请。

**注意(可选操作):**当判断应用未获取某些权限并准备向用户发起动态权限申请前,可以加入一些增强产品体验方面的优化操作。 比如,可以用代码设计实现一个美观漂亮的交互弹窗,其内容主要向用户阐述说明一下我们这个应用为什么要获取这个动态权限,及如果无法获取用户的这个权限,将导致应用的某些功能无法使用的结果说明,以期让用户明白理解这个动态权限授权的必要性和合理性。

实现流程

  1. 设置targetSdkVersion 版本值 具体操作为打开你的项目res文件夹下的manifest.xml文件,查看其中的targetSdkVersion值是否≥26,如果不是则进行修改。在当前的版本中,新创建的项目中,已自动创建manifest.xml 文件,并设置targetSdkVersion默认值为30(见下面截图)。

如果你的项目是旧项目,其中还没有该文件,则可以使用新建文件的方式,自行创建即可。

YonBuilder移动开发应用动态权限功能开发教程

PS: 设置 targetSdkVersion 版本值 ≥ 26的原因

在android上使用动态权限,要求APP编译的目标SDK(即targetSdkVersion)为23及以上(对应为android6.0及以上系统),22及以下系统会执行缺省处理(手机厂商也可能定制处理),YonBuild移动开发为满足更普遍的开发需求,在平台编译时,默认配置targetSdkVersion为22,即权限走系统缺省处理。自2018年11月开始,GooglePlay以及国内大部分应用市场要求APP编译目标SDK必须为26及以上,否则不予提交审核,所以需要在项目中设置声明一下当前。

  1. 动态权限代码编写 动态权限的申请和检测的时机,可以在App启动之后进行集中检测申请,也可以在不同的页面下,在涉及相关的隐私的逻辑中进行检测申请。

2.1 动态权限检测

// 定义需要动态申请的权限组数变量
const permissonList = ['photos', 'microphone', 'camera', 'notification'];

// 使用hasPermission函数判断当前应用已获取权限的授权结果
const resultList = api.hasPermission({
list: permissonList
});

2.2 处理检测结果数据

// 定义缓存未授权权限的数组变量
const tNeed = [];

// 遍历处理检测结果数据,将未授权的权限重新push到一个新数组
for (let i = 0; i < resultList.length; i++) {
const element = resultList[i];
if (!element.granted) {
tNeed.push(permissonList[i]);
}
}

// 结果判断
if (tNeed.length === 0) {
// 说明当前权限已获得授权,则当前动态权限校验已完成,调用后续的正常的业务逻辑代码即可。
nextToDo(); // 调用后续的业务函数,这里仅做示例
} else {
// 这里编写对于未授权的权限的后续处理逻辑
/**
* [可选]这里可以加入一些产品优化方面的代码逻辑,例如
* 可以弹出一个弹窗,向用户说明授予相关权限的必要性,当
* 用户点击弹出的同意按钮后,再调用下面的api.requestPermission函数
*/
// 执行动态权限申请的相关业务逻辑(详见2.3)
requestPermission(tNeed);
}

2.3动态权限申请

function requestPermission(perList){
api.requestPermission({
list: perList
}, function(ret) {
// 对判断结果进行判断处理
handlePermissionResult(ret)
});
}

2.4 对动态申请结果的处理逻辑

​api.requestPermission​的函数回调参数(见下图)

YonBuilder移动开发应用动态权限功能开发教程

对于​api.requestPermission​的回调结果,需要针对授权和未授权两种结果进行判断。已授权则走正常的后续业务逻辑即可。对于未获得用户授权的结果,需要开发者根据项目的产品业务逻辑需要去编写相应的业务处理逻辑,比如是直接退出App、或退出当前页面、或再次弹出提示弹窗等。

handlePermissionResult(resData, sucCB) {
const [list = [], never] = resData;
// 遍历申请结果数组
const badPermissions = [];
list.forEach(permission => {
if(!permission.granted) {
// 动态权限未获得授权
badPermissions.push(permission);
}
});
if(badPermissions.length === 0) {
// 说明申请权限都已获得授权,则返回执行正常的后续业务逻辑
if(typeof sucCB === 'function') sucCB();
} else {
// 这里需要结合具体的业务逻辑,编写对于未授权权限的处理逻辑。
api.closeWidget({ silent: true }); // 示例代码,不授权将退出应用
}
}

2.5 注意事项

1、当程序进行动态权限申请,而用户选择了不再提示(即返回结果never = true)时,后续如果程序再次调用api.requestPermission进行动态权限申请时,应用程序会自动跳转到手机系统的设置页面,不会再弹出申请权限的弹窗提示。

2、如果某个权限涉及到程序的业务逻辑闭环,则最佳实践的方法是推荐每次该业务逻辑执行前,均均进行该权限的校验处理,而不是仅校验一次。因为在程序运行中,用户是有可能切出到应用外,直接在手机设置里取消掉对于应用的相关授权,而这时应用程序内是无法捕获相关事件的,从而绕过检测机制,导致程序出现异常错误。

3、所有应用程序中用到的隐私权限,都需要在程序编译打包的设置页面,进行相关权限的勾选声明,否则程序运行会出现各种异常错误。

YonBuilder移动开发应用动态权限功能开发教程

总结

本文仅介绍了动态权限的判断和处理的简单基本逻辑编写,在实际的应用开发中,开发者需要结合具体的业务逻辑场景去灵活的编写业务逻辑代码。对于一些不重要的权限,可以在App启动后集中做一次判断处理,对于那些会影响后续业务流程的重要权限,需要在每一次的逻辑代码执行之前,都去进行一次权限的校验,从而避免程序产生漏洞,发生异常错误。另外对于未获取用户授权的相关权限处理,开发同学可以和产品方面沟通,结合产品业务逻辑,去综合考虑后续的处理逻辑。