news 2026/7/23 1:32:48

HarmonyOS掌上记账APP开发实践第67篇:鸿蒙权限声明体系 — INTERNET / PUBLISH_AGENT_REMINDER 等权限的合理使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS掌上记账APP开发实践第67篇:鸿蒙权限声明体系 — INTERNET / PUBLISH_AGENT_REMINDER 等权限的合理使用

鸿蒙权限声明体系 — INTERNET / PUBLISH_AGENT_REMINDER 等权限的合理使用

文章简介

HarmonyOS 的应用权限体系是保障用户隐私和应用安全的核心机制。MoneyTrack 作为一款联网记账应用,需要在 module.json5 中声明多项权限,包括网络访问权限(INTERNET)、代理提醒权限(PUBLISH_AGENT_REMINDER)等。本文详细解析鸿蒙权限体系的分类(system_grant / user_grant)、声明方式、运行时权限请求以及权限被拒绝时的降级处理策略。

核心知识点

1. 权限声明到运行时请求的完整流程

从开发者在 module.json5 中声明权限,到系统在运行时请求用户授权,经历了以下完整链路:

system_grant

user_grant

同意

拒绝

开发者在 module.json5
声明 requestPermissions

权限类型判断

应用安装时
系统自动授予

应用安装时
仅注册不授权

应用运行时直接使用

运行时调用
requestPermissionsFromUser

用户选择

获得授权
执行敏感操作

权限被拒绝

降级处理

提供合理用户体验
不崩溃不闪退

可随时在设置中
关闭权限

2. system_grant 与 user_grant 完整对比表

鸿蒙权限体系将权限分为 system_grant(系统授权)和 user_grant(用户授权)两大类,理解二者的区别至关重要:

对比维度system_grantuser_grant
授予时机应用安装时自动授予运行时动态请求
用户交互无需用户参与需弹窗征得用户同意
可撤销性无法单独撤销,卸载即移除用户可随时在设置中关闭
典型权限INTERNET、PUBLISH_AGENT_REMINDER位置信息、相机、麦克风
风险等级低风险,不涉及敏感数据高风险,涉及用户隐私
声明要求声明即可,无需 reason必须提供 reason 说明用途
代码要求仅声明,无需运行时请求声明 + 运行时请求 + 降级处理

3. 运行时权限请求完整代码

对于 user_grant 类权限,除了在module.json5中声明外,还需在运行时主动请求授权:

import { common } from '@kit.AbilityKit'; import { abilityAccessCtrl } from '@kit.AbilityKit'; async function requestPermission(context: common.UIAbilityContext): Promise<void> { const atManager = abilityAccessCtrl.createAtManager(); const permissions: Array<string> = [ 'ohos.permission.LOCATION', // 示例 user_grant 权限 'ohos.permission.CAMERA', ]; try { const grantResults: Array<number> = await atManager.requestPermissionsFromUser( context, permissions ); const allGranted = grantResults.every( result => result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED ); if (allGranted) { hilog.info(0xFF00, 'Permission', '所有权限已授予'); } else { hilog.warn(0xFF00, 'Permission', '部分权限被拒绝'); handlePermissionDenied(); } } catch (err) { hilog.error(0xFF00, 'Permission', `权限请求异常: ${JSON.stringify(err)}`); } }

4. 权限被拒绝的降级处理

用户拒绝授权时,应用不能直接崩溃或闪退,必须提供合理的降级体验。鸿蒙推荐以下处理策略:

  • 功能不可用提示:不允许使用该功能时,展示功能不可用的友好提示,而非报错。例如,拒绝位置权限时,手动输入地址作为替代方案。
  • 二次申请引导:首次被拒后,下次触发同一功能时再次申请。若用户选择「不再询问」,引导用户前往系统设置手动开启。
  • 不影响核心功能:敏感权限(如位置)被拒不应影响应用的核心功能(如记账)。核心功能应尽量不依赖 user_grant 权限。
function handlePermissionDenied(): void { AlertDialog.show({ title: '权限被拒绝', message: '部分功能需要相关权限才能使用。您可以在系统设置中重新开启。', primaryButton: { value: '去设置', action: () => { context.startAbility({ bundleName: 'com.huawei.hmos.settings', abilityName: 'com.huawei.hmos.settings.MainAbility', }); }, }, secondaryButton: { value: '知道了', action: () => { /* 不做操作 */ }, }, }); }

5. 权限最佳实践

  • 最小权限原则:只申请应用功能真正需要的权限,不提前申请、不超范围申请。
  • 按需申请:在用户实际触发需要权限的功能时才申请,而非应用启动时一次性申请所有权限。
  • 说明用途:声明 user_grant 权限时,必须在reason字段中详细说明用途,并在弹窗中清晰展示。
  • 权限检查前置:每次调用敏感 API 前检查权限状态,避免因权限被撤销导致运行时异常。
  • 测试覆盖:在测试环境中覆盖权限被拒、权限关闭等多种场景,确保降级体验完整。

项目代码案例

网络权限 + 代理提醒权限的声明配置

在 MoneyTrack 中,各模块的module.json5均声明了INTERNET权限用于网络通信。PUBLISH_AGENT_REMINDER权限用于发送预算超支等提醒通知。

文件路径示例:

  • commons/lib_network/src/main/module.json5
  • products/entry/src/main/module.json5
  • features/home/src/main/module.json5

在 HomeVM 中,预算超支时调用notificationManager发送通知,依赖于PUBLISH_AGENT_REMINDER权限:

const request: notificationManager.NotificationRequest = { id: 1001, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // ... }, };

推荐参考文档

  • HarmonyOS 权限开发指南(安全章节)
  • module.json5 配置文件规范
  • notificationManager 通知 API 文档
  • abilityAccessCtrl 权限管理 API 参考
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 1:31:59

Linux救援模式和系统恢复

Linux 的救援模式和系统恢复、SysVinit、systemd、运行级别 文章目录 一、Linux 服务是什么 1.1 服务的主要特征1.2 常见服务类型 二、CentOS 6&#xff1a;SysVinit 服务管理 2.1 service 命令2.2 SysVinit 的启动思路 三、CentOS 7/8/9&#xff1a;systemd 服务管理 3.1 sys…

作者头像 李华
网站建设 2026/7/23 1:28:31

Unity动画覆盖控制器:实现逻辑复用与表现差异的高效方案

1. 项目概述&#xff1a;为什么需要动画覆盖&#xff1f;在Unity引擎开发中&#xff0c;动画系统是赋予角色和物体生命力的核心。无论是主角的挥剑、怪物的咆哮&#xff0c;还是一个开关门的简单动作&#xff0c;都离不开Animator Controller的驱动。然而&#xff0c;在实际项目…

作者头像 李华
网站建设 2026/7/23 1:26:47

学 Linux_day7 编写第一个Bash脚本,实现一键编译运行第一个C程序

第一个 Bash 脚本&#xff1a;一键编译运行 Hello World一、我们之前怎么做&#xff1f; 之前写好了 hello.c 后&#xff0c;操作过程是&#xff1a; gcc hello.c -o hello ./hello每次修改代码后&#xff0c;都要重复敲这两条命令。 现在我们把它写进一个脚本&#xff0c;以后…

作者头像 李华
网站建设 2026/7/23 1:25:39

2026最新5款Claude Code高性价比平替实测对比

我是一名全栈独立开发者&#xff0c;平时接一些外包项目来做&#xff0c;每个月都要在AI编程工具上花不少订阅费。最近 Claude Code 按用量计费的模式让我账单越来越高&#xff0c;随便用用一个月就要一两百美元&#xff0c;对于独立开发者来说实在吃不消。我开始寻找合适的平替…

作者头像 李华
网站建设 2026/7/23 1:22:15

架构思维在人生规划中的应用与实践

1. 从技术架构到人生架构的思维跃迁第一次听到"人生架构"这个概念是在2015年北欧的一次技术峰会上。当时Tieto&#xff08;叠拓&#xff09;的一位首席架构师在演讲结尾突然话锋一转&#xff1a;"我们整天讨论系统架构&#xff0c;但有没有想过自己的人生也需要…

作者头像 李华