权限管理,鸿蒙Next版

打印 上一主题 下一主题

主题 504|帖子 504|积分 1512

  一、应用权限概述

注意事项

在鸿蒙开辟中,调用部门 API 时需要申请权限后,才能调用,如:网络请求,获取网络信息等。
部门 API 权限调用的时候还会弹窗,如:麦克风、位置、摄像头、相册、传感器(sensor)、日历等。

申请应用权限时,需要注意两个关键信息:

  • 权限级别
  • 授权方式
权限文档截图 


 

 
应用权限级别

体系根据应用的APL等级设置进程域和数据域标签,并通过访问控制机制限制应用可访问的数据范围,从而实如今机制上消减应用数据泄露的风险。
不同APL等级的应用能够申请的权限等级不同,且不同的体系资源(如:通讯录等)或体系本领(如:访问摄像头、麦克风等)受不同的应用权限保护。通过严酷的分层权限保护,有效抵御恶意攻击,确保体系安全可靠。
应用权限管控的具体介绍,请参考应用权限管控概述。
应用APL等级

应用的等级可以分为以下三个等级,等级依次提高。
APL级别
阐明
明白话
normal
默认情况下,应用的APL等级都为normal等级。
都能用
system_basic
该等级的应用服务提供体系基础服务。
要署名证书
system_core
该等级的应用服务提供操作体系核心本领。
仅对体系应用开放
不开放
 授权方式概述

根据授权方式的不同,权限类型可分为 system_grant 和 user_grant。
明白话:授权方式为 user_grant 会弹窗,而 system_grant 自动授权。
system_grant(体系授权)

system_grant指的是体系授权类型,在该类型的权限允许下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许实验的操作对体系大概其他应用产生的影响可控。
如果在应用中申请了system_grant 权限,那么体系会在用户安装应用时,自动把相应权限授予给应用。
user_grant(用户授权)

user_grant指的是用户授权类型,在该类型的权限允许下,应用被允许访问的数据将会涉及到用户或设备的敏感信息,应用被允许实验的操作可能对体系大概其他应用产生严重的影响。
该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应权限,从而乐成访问操作目标对象。
申请 user_grant 用户授权

权限管理封装

由于 查抄授权,动态申请授权,处理惩罚授权效果 逻辑都是相同的,我们通过 class 类把功能封装,方便复用。
根本结构

  1. import { Permissions } from '@kit.AbilityKit';
  2. class PermissionManager {
  3.   // 检查是否授权
  4.   checkPermissions(permissions: Permissions[]) {
  5.   }
  6.   // 动态申请授权(首次弹窗申请)
  7.   async requestPermissions(permissions: Permissions[]) {
  8.   }
  9.   // 打开系统设置的权限管理页(处理授权结果)
  10.   openPermissionSettingsPage() {
  11.   }
  12. }
  13. // 导出 Manager
  14. export const permissionManager = new PermissionManager()
复制代码
封装参考

  1. import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
  2. class PermissionManager {
  3.   // 检查是否授权
  4.   checkPermissions(permissions: Permissions[]) {
  5.     // 程序访问控制管理
  6.     const atManager = abilityAccessCtrl.createAtManager();
  7.     // 获取 bundle 信息
  8.     const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  9.     // 提取 tokenID 标识
  10.     const tokenID = bundleInfo.appInfo.accessTokenId
  11.     // 校验应用是否被授予权限
  12.     const authResults = permissions.map((item) => atManager.checkAccessTokenSync(tokenID, item))
  13.     // 返回是否已授权结果
  14.     return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  15.   }
  16.   // 动态申请授权(首次弹窗申请)
  17.   async requestPermissions(permissions: Permissions[]) {
  18.     // 程序访问控制管理
  19.     const atManager = abilityAccessCtrl.createAtManager();
  20.     // 拉起弹框请求用户授权
  21.     const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions)
  22.     // 获取请求权限的结果
  23.     const isAuth = grantStatus.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  24.     // 返回 Promise 授权结果
  25.     return isAuth ? Promise.resolve(true) : Promise.reject(false)
  26.   }
  27.   // 打开系统设置的权限管理页(处理授权结果)
  28.   openPermissionSettingsPage() {
  29.     // 获取上下文
  30.     const context = getContext() as common.UIAbilityContext
  31.     // 获取包信息
  32.     const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
  33.     // 打开系统设置页
  34.     context.startAbility({
  35.       bundleName: 'com.huawei.hmos.settings',
  36.       abilityName: 'com.huawei.hmos.settings.MainAbility',
  37.       uri: 'application_info_entry',
  38.       parameters: {
  39.         // 按照包名打开对应设置页
  40.         pushParams: bundleInfo.name
  41.       }
  42.     })
  43.   }
  44. }
  45. export const permissionManager = new PermissionManager()
复制代码
跨级别申请的权限

跨级别权限常见问题

在 module.json5 文件中,如果添加的权限为ACL使能:true,在编译时会报错,如:通讯录、照片。


  • ohos.permission.READ_CONTACTS
  • ohos.permission.WRITE_CONTACTS
  • ohos.permission.READ_IMAGEVIDEO
  • ohos.permission.WRITE_IMAGEVIDEO
ACL权限



  • 访问控制列表ACL(Access Control List)提供了办理低等级应用访问高等级权限问题的特殊渠道。
  • 从 DevEco Studio 4.0 Release 版本起,支持在调测阶段自动署名快速申请ACL权限
API版本(compileSdkVersion)
支持的ACL权限
API Version > 10
     

  • ohos.permission.READ_CONTACTS
  • ohos.permission.WRITE_CONTACTS
  • ohos.permission.READ_AUDIO
  • ohos.permission.WRITE_AUDIO
  • ohos.permission.READ_IMAGEVIDEO
  • ohos.permission.WRITE_IMAGEVIDEO
  • ohos.permission.SYSTEM_FLOAT_WINDOW
  • ohos.permission.READ_PASTEBOARD
  • ohos.permission.ACCESS_DDK_USB
  • ohos.permission.ACCESS_DDK_HID
自动署名步骤


  • 确保已毗连真机或模拟器。
 
2.登录华为帐号后,勾选“Automatically generate signature”,即可完成署名。
 

   温馨提示
  项目要上线时,调用 ACL 权限需要手动署名,天生密钥和证书请求文件。
  由于流程和步骤较多,在后续文章中再增补。
  当下先使用自动署名方式调用 ACL 权限。
  

  • 在 module.json5 中添加权限
  1. {
  2.   "module": {
  3.     "requestPermissions": [
  4.       // ...
  5.       // 通讯录
  6.       {
  7.         "name": "ohos.permission.READ_CONTACTS",
  8.         "reason": '$string:permission_reason_contact',
  9.         "usedScene": {}
  10.       },
  11.       {
  12.         "name": "ohos.permission.WRITE_CONTACTS",
  13.         "reason": '$string:permission_reason_contact',
  14.         "usedScene": {}
  15.       },
  16.       // 照片
  17.       {
  18.         "name": "ohos.permission.READ_IMAGEVIDEO",
  19.         "reason": "$string:permission_reason_imageVideo",
  20.         "usedScene": {}
  21.       },
  22.       {
  23.         "name": "ohos.permission.WRITE_IMAGEVIDEO",
  24.         "reason": "$string:permission_reason_imageVideo",
  25.         "usedScene": {}
  26.       },
  27.     ],
  28.   }
  29. }
复制代码
2.添加 reason 权限使用来由。
   

  • 当申请的权限为 user_grant 权限时必填,并且需要进行多语种适配。
  • 参考句式:用于某事,如:(麦克风)用于录制加密视频和音频。
  
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表