背景概述

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

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

API介绍

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

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

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

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

实现思路

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

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

实现流程

1. 设置targetSdkVersion 版本值

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

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

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

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

2. 动态权限代码编写

动态权限的申请和检测的时机,可以在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的函数回调参数(见下图)

对于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. 所有应用程序中用到的隐私权限,都需要在程序编译打包的设置页面,进行相关权限的勾选声明,否则程序运行会出现各种异常错误。

总结

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

YonBuilder移动开发(APICloud)应用动态权限功能开发教程相关推荐

  1. 微信公众平台开发(六) 翻译功能开发

    转载自:http://www.php100.com/html/php/api/2013/0909/6130.html 微信公众平台开发(六) 翻译功能开发 来源:David Camp   时间:201 ...

  2. 云炬Android开发笔记 6启动图功能开发与封装

    阅读目录 1.启动图功能开发与封装(倒计时效果) 2. 持久化 3.倒计时工具库封装 4.第一个启动页面的倒计时 5.启动图功能开发与封装(轮播效果) 5.1 轮播图片的添加 5.2 指示器的添加 6 ...

  3. AUTOSAR从入门到精通100讲(四十一)-基于AUTOSAR与Matlab开发应用层三部曲-应用层总体功能开发和集成

    AUTOSAR应用层开发方法 AUTOSAR给汽车控制器软件提供了一个整体性的架构定义,Matlab也是目前主流的汽车控制器应用层软件开发工具,如何使用Matlab开发符合AUTOSAR架构的的应用层 ...

  4. 云炬Android开发笔记 7登陆注册功能开发

    阅读目录 1.注册UI及验证逻辑实现 1.1 布局 1.2 注册信息的验证和逻辑 2.登录UI及验证逻辑实现 2.1 布局 2.2 登录的逻辑框架 3.服务器数据简单介绍 3.1 服务器的数据 3.2 ...

  5. STM32 CANbootloader 升级功能开发(3)逻辑功能开发

    1. 前言 最后这部分内容,主要是一些逻辑关键功能: 例如, bootloader如何调整到app地址段执行? 如何解析CAN数据? 如何防止CAN设备变砖? 2. bootloader跳转app功能 ...

  6. 云炬Android开发笔记 17商品详情功能开发

    阅读目录 1.商品详情ui框架设计 1.1 自定义圆形控件 1.2 底部栏的布局 1.3 整体布局 2.商品详情UI-MD风格伸缩渐变效果实现 2.1 ui的绑定 2.2 服务器中商品详情页的数据的取 ...

  7. java 接口权限控制_手把手教你搞定权限管理,结合Spring Security实现接口的动态权限控制!...

    SpringBoot实战电商项目mall(30k+star)地址:github.com/macrozheng/- 摘要 权限控管理作为后台管理系统中必要的功能,mall项目中结合Spring Secu ...

  8. IDM统一权限功能修改心得

    IDM身份管理系统是为解决企业内部多系统间用户信息不一致而开发的,主要定位于解决企业在5A功能上的需求,即:Account账号管理.Authentication认证管理.Authorization授权 ...

  9. 【Android 应用开发】动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )

    文章目录 一.申请权限 二.判定权限申请结果 三.判定 " 不再询问 " 情况 四.完整代码示例 1.权限管理代码 2.主界面代码 3.执行结果 五.博客资源 一.申请权限 首先 ...

最新文章

  1. 《人件集 人性化的软件开发》阅读笔记01
  2. oracle导库需要删除原始库,导入dmp文件时,需要删除原有ORACLE数据库实例
  3. SQL Server--通过存储过程生成表数据的脚本
  4. hashmap冲突的解决方法以及原理分析
  5. phpexcel删除行_php - PHPExcel从大型工作表中删除行 - 堆栈内存溢出
  6. 一键安装Tengine服务器,TengineRPM(LTMP)构建高效、稳定、安全、易用的Web平台
  7. unef螺纹_统一螺纹(美制螺纹)UN,UNC,UNF,UNEF详细区别
  8. 06_JavaEE回顾笔记Ⅱ
  9. 软件工程 之 软件维护
  10. Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
  11. 正则表达式-验证QQ号
  12. dateframe取某列数据_DataFrame数据选取全攻略
  13. 计算机桌面怎么全屏显示,如何让电脑显示器屏幕显示全屏
  14. 2021-11-06(为什么程序员是青春饭)
  15. hdfs或hive的snappy.parquet文件查看
  16. 自动取消订单/自动确认收货
  17. 芯片工程师成长之路_一个FPGA工程师的成长之路
  18. 产品经理该学习什么?
  19. 高级经理人的成功“相人术”
  20. 小白看完都会了!分享两道阿里P7究极难度算法题,已拿offer入职

热门文章

  1. Skr-Eric的HTML课堂(二)——HTML的列表标签和图片与超链接
  2. Ubuntu 9.10 安装 金山词 心得
  3. 网工内推 | 服务商招网工,大专以上即可
  4. 储存区域网路(SAN)-使用Linux(Centos5)来做iSCSI Target 篇
  5. 前端实现图片查看器(滚轮放大,缩小,旋转)——Viewer.js
  6. Dubbo 是什么?
  7. Dubbo学习-注册中心
  8. 高纯有色金属的市场现状
  9. IOS - 5分钟搞定一个APP
  10. 计算机中丢失mwusb,icbc_mwusbkey.dll