【天体运行模拟|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
2026/9/1 15:14:02 网站建设 项目流程

【天体运行模拟|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致

权限合规最容易出现的错误,不是忘记写一段隐私文案,而是四个事实互相矛盾:module.json5声明了权限,代码没有对应功能;页面说“完全离线”,依赖却偷偷联网;系统拒绝授权后功能仍反复弹窗;AppGallery Connect 填写的数据处理范围又与应用内政策不同。审核人员看到的是整个产品行为,不是某一个文件。

“天体运行模拟”的真实module.json5没有requestPermissions字段,源码扫描也没有发现网络请求、相机、麦克风、位置或通讯录权限申请;PrivacyPolicyPage.ets明确说明应用完全离线,本地保存模拟次数、学习时长、收藏 ID、观察笔记和偏好设置,并提供“我的-设置-清除数据”路径。就当前版本而言,它的正确策略不是设计复杂的授权弹窗,而是持续证明“无敏感权限、无第三方 SDK、数据不离开设备”。

本文面向 HarmonyOS 5.0 及以上版本,基于真实源码建立权限与隐私核验流程,并进一步说明:如果未来新增相机、位置或联网能力,应怎样让清单声明、运行时申请、拒绝路径、政策文本和 AGC 字段同步变化。

项目基线:应用版本1.0.0,Bundle Name 为com.jiaweikan.one13,目标设备包含 phone、tablet 与 2in1。本文只描述源码中可以复核的能力,不把“没有搜索到调用”夸大为对所有构建产物和第三方二进制的绝对证明。

一、先建立五份事实清单

权限审查不能只看 Manifest。至少需要五份清单:

清单要回答的问题
产品功能用户实际能做什么
Manifest 权限安装包声明了什么
运行时调用何时读取数据、申请能力
数据处理保存什么、保存多久、如何删除
上架材料政策、隐私标签、描述怎样表述

五者必须能逐项映射。任何一项多写、少写或时间点不一致,都可能变成审核风险。

二、真实 module.json5 没有权限声明

项目模块配置主要包含入口 Ability:

{ "module": { "name": "entry", "type": "entry", "mainElement": "EntryAbility", "deviceTypes": [ "phone", "tablet", "2in1" ], "abilities": [ { "name": "EntryAbility", "exported": true } ] } }

文件没有requestPermissions。这与离线天体模拟、知识阅读、本地收藏和笔记的功能范围一致。不要为了“以后可能用”提前加入INTERNET、位置或媒体权限;未使用权限也会增加解释和审核成本。

三、没有 requestPermissions 不等于审查结束

还要扫描 ArkTS、原生库、HAR/HSP 和依赖。源码检查重点包括:

requestPermissionsFromUser ohos.permission http.createHttp fetch Web camera microphone location contacts analytics / ads / push

当前入口源码未发现这些能力调用,第三方统计、广告和推送 SDK 也未在给定源码中出现。但发布前仍应审计oh-package.json5、锁文件、最终依赖树和构建产物,避免只扫描页面目录。

四、隐私政策真实写了什么

PrivacyPolicyPage.ets说明:

  • 不收集姓名、手机号、邮箱、身份证和位置;
  • 不收集设备标识符;
  • 不读取通讯录、短信、相册、麦克风和摄像头;
  • 不记录网络访问与浏览历史;
  • 模拟次数、学习时长、收藏、笔记和设置保存在应用沙箱;
  • 卸载后数据随应用沙箱清除;
  • 未集成第三方统计、广告或推送 SDK。

这些陈述与当前权限清单和源码扫描结果方向一致,是一条良好基线。

五、本地数据仍然需要说明

“不上传”不等于“不处理数据”。用户输入的观察笔记、收藏列表和使用统计仍属于应用处理的数据。政策需要说明用途、位置、生命周期和删除方式。

建议使用结构化表格:

数据用途存储位置删除方式
收藏实验 ID恢复收藏Preferences清除数据或卸载
观察笔记用户复盘实验Preferences单条删除、清除数据或卸载
模拟次数本地统计Preferences清除数据或卸载
学习时长本地统计Preferences清除数据或卸载
偏好设置恢复界面选项Preferences清除数据或卸载

政策中写清楚这些,比笼统说“我们重视隐私”更可验证。

六、应用沙箱是边界,不是免审标签

Preferences 位于应用沙箱,其他普通应用不能直接访问,但开发者仍需考虑:

  • 是否真的只保存必要字段;
  • 是否把笔记正文写进日志;
  • 是否存在备份、导出或分享;
  • 清除数据是否覆盖所有键;
  • 崩溃报告是否包含用户输入;
  • 卸载后是否仍有外部目录残留。

当前项目描述的是本地沙箱保存,不应延伸宣称“数据已加密”或“绝对无法泄露”,除非源码和验证证据确实支持。

七、清除数据必须与政策一致

政策告诉用户可以在“我的-设置-清除数据”删除全部本地数据。这个承诺必须通过实际代码和测试证明。清除流程至少要覆盖收藏、笔记、实验记录、统计数字和偏好,而不是只清缓存目录。

interface ClearResult { preferencesCleared: boolean cacheCleared: boolean uiSnapshotReset: boolean }

删除成功后还要重置AppStorage快照和当前页面状态,否则磁盘已空、界面仍显示旧计数,会让用户怀疑删除无效。

八、无权限应用不应弹“隐私同意”假流程

当前应用不申请敏感权限,也不联网处理个人信息。不能机械添加一个强制“同意隐私政策才能使用”的阻断弹窗,以为弹窗越多越合规。更重要的是政策可访问、信息透明、功能与声明一致。

如果未来确实需要基于同意处理个人信息,应根据具体法律基础和平台要求设计,而不是把所有本地离线应用套进同一模板。

九、政策入口要容易找到

当前隐私政策从“我的-设置-隐私政策”进入,符合在应用内提供持续可访问入口的思路。入口还应验证:

  • 首次安装和正常使用后都能访问;
  • 无需登录;
  • 页面可滚动到最后一条;
  • 返回按钮和系统返回都有效;
  • 小窗口与大字体下文字不截断;
  • 政策版本和生效日期真实更新。

政策不是只在首次启动出现一次,之后就找不到。

十、政策日期不能长期沿用模板

源码显示版本1.0.0、生效日期2024 年 4 月 1 日。发布新版本前应核对:日期是否对应真实生效时间,政策内容是否覆盖当前功能,页面版本是否与上架版本匹配。

不要只更新版本号而不复核文本;也不要为了显得新,写一个尚未生效或无法证明的日期。

十一、联系方式必须真实可用

政策称用户可通过“帮助与反馈”页面中的邮箱联系。审核应继续检查该页面是否真的提供邮箱、地址是否可用、是否引入网络或第三方跳转,以及政策与帮助页表述是否一致。

若联系方式变化,需要同步应用内政策、官网政策和 AGC 信息。不能在文章或上架材料中杜撰联系方式。

十二、未来新增权限时先做需求论证

假设新增“拍摄实验截图”功能,不应第一步就在module.json5加相机权限。先确认是否能使用系统 Picker 或截图能力而无需相机;只有确实要实时拍摄才申请相机。

需求论证模板:

功能:拍摄现实天体观察记录 必要数据:相机画面 替代方案:系统相册选择 / 不授权手动记录 申请时点:用户点击“拍摄” 拒绝结果:保留手动笔记与相册选择 政策变化:新增相机用途,不上传 AGC 变化:更新权限与隐私标签

“最小必要”必须落到每个功能,而不是一句口号。

十三、Manifest 声明是第一道门

需要敏感权限时,在模块配置中声明对应权限及必要说明。具体字段和权限级别必须以目标 SDK 的华为官方文档为准,不能照搬旧版本示例。

概念结构如下:

{ "requestPermissions": [ { "name": "ohos.permission.CAMERA", "reason": "$string:camera_reason", "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" } } ] }

这只是示意。真实项目应核对权限是否需要动态授权、适用设备、使用场景和配置约束。

十四、运行时申请必须由用户动作触发

权限不应在应用启动时成批申请。用户点击“拍摄”“定位”或“录音”时,再说明当前功能需要什么,并调用运行时授权 API。

async function ensureCameraForCapture(): Promise<boolean> { // 通过统一 PermissionService 检查和申请 // 返回授权结果,不在页面散落系统 API return false }

页面只处理结果;PermissionService封装检查、申请和状态映射。这样权限逻辑可以集中测试,也避免不同页面出现不同文案。

十五、拒绝是正常业务分支

用户拒绝授权不应被当成异常崩溃。页面至少区分:

type PermissionState = | 'not_requested' | 'granted' | 'denied' | 'restricted'

拒绝后提供可理解结果:保留手动输入、允许使用系统 Picker、隐藏仅依赖该权限的动作,或明确结束当前功能。不要立即再次弹窗,也不要用“不给权限无法使用整个应用”诱导用户。

十六、永久拒绝后不要循环申请

当系统状态表明不能继续直接申请时,页面应解释如何在系统设置中管理权限,并让用户主动决定是否前往。返回应用后重新检查状态,而不是假设已授权。

async function resumeAfterSettings(): Promise<void> { const state = await permissionService.getCameraState() this.permissionState = state }

跳转设置不是授权成功,只有重新查询结果才是事实。

十七、权限说明要具体到当前功能

“为了提供更好的体验”不是合格理由。说明应包含对象与动作:

  • 相机:拍摄用户主动添加的观察记录;
  • 位置:显示当前位置对应的可见天体;
  • 麦克风:录制用户主动创建的语音笔记;
  • 通知:提醒用户设定的观察时间。

若应用没有这些功能,就不应出现这些说明或权限。

十八、Picker 与敏感权限要区分

选择单张图片、保存导出文件等场景,优先评估系统 Picker。Picker 让用户明确选择具体内容,通常比申请大范围媒体访问更符合最小化原则。

但不能笼统宣称“Picker 永远不需要任何配置”。每个 Kit、目标版本和使用场景都应查官方文档,并验证取消、无可用应用、文件损坏和窗口化返回路径。

十九、网络权限会改变整个隐私模型

当前政策明确“不需要联网”“不会上传”。未来一旦添加 HTTP API、云同步、在线反馈、分析或广告,就不只是加一个INTERNET权限:

  • 离线描述需要修改;
  • 数据接收方和处理目的需要说明;
  • 服务域名与安全策略需要审查;
  • 错误和断网状态需要实现;
  • 第三方 SDK 清单需要更新;
  • AGC 隐私字段需要重新填写;
  • 删除账号、撤回同意等权利可能进入范围。

网络能力属于发布前重新触发合规审查的重大变化。

二十、第三方 SDK 不能只看 import

SDK 可能通过构建依赖、HAR、原生库或插件接入。审计需要检查:

  1. oh-package.json5与锁文件;
  2. 模块依赖和原生库;
  3. SDK 初始化代码;
  4. 网络域名与后台行为;
  5. SDK 自身权限和数据类型;
  6. 是否在用户同意前初始化;
  7. 政策中是否说明名称、提供方、目的和数据。

当前政策称“未集成任何第三方统计、广告或推送 SDK”,发布包必须继续支持这一结论。

二十一、日志也是数据出口

离线应用虽然不联网,调试日志仍可能在测试、崩溃分析或用户反馈时被导出。禁止记录笔记正文、完整收藏 JSON、设备标识符和路径中的私人信息。

// 推荐:记录动作与结果,不记录正文 logger.info('note saved', { noteId, length: content.length })

release 构建还应检查调试日志、测试开关和开发服务器地址是否清理。

二十二、多设备权限体验

phone、tablet 和 PC/2in1 的权限结果相同,交互形态却可能不同:

  • 小窗口下说明文字不能被系统弹窗遮挡;
  • 2in1 要支持鼠标、键盘触发和返回焦点;
  • 平板分屏返回后页面状态要恢复;
  • 不支持某能力的设备要隐藏或禁用入口;
  • 拒绝后的替代路径在所有设备都可达。

权限可用性应由能力查询决定,不应只按设备类型猜测。

二十三、AGC 字段必须来自同一清单

上架时,应用描述、隐私政策、隐私标签、权限说明、SDK 列表、联网情况、登录要求和数据删除方式都应从同一份数据清单生成或人工核对。

对当前版本,可验证描述应保持克制:

  • 单机离线运行;
  • 不申请敏感权限;
  • 不集成统计、广告和推送 SDK;
  • 本地保存收藏、笔记、记录与设置;
  • 用户可清除数据或卸载删除。

不要额外声称“匿名化上传”“云端加密”或“跨设备同步”。

二十四、官方规则要在实现时复核

HarmonyOS 官方的应用隐私保护强调透明、最小化、动态申请敏感权限和保护用户控制权;选择和同意要求权限申请说明用途、避免诱导,并提供隐私政策访问方式。

上架前还应参考提交 HarmonyOS 应用中的隐私、兼容性、稳定性与安全测试入口。由于平台规则会更新,最终结论以发布当日官方文档和 AGC 页面为准。

二十五、自动一致性检查

可以在 CI 或发布脚本中执行:

1. 解析 module.json5 的 requestPermissions 2. 扫描源码权限 API 与网络 API 3. 扫描依赖中的 SDK 和原生库 4. 提取隐私政策中的权限与数据类别 5. 对比维护的 privacy-inventory.json 6. 差异不为空时阻止发布

结构化清单示例:

{ "network": false, "sensitivePermissions": [], "thirdPartySdks": [], "localData": [ "favorites", "notes", "records", "preferences" ] }

自动检查不能代替人工测试,但能阻止 Manifest 改了、政策忘记改这类低级不一致。

二十六、拒绝路径测试用例

即使当前版本没有敏感权限,也应为未来能力建立模板:

场景预期
首次允许功能继续,状态正确
首次拒绝不崩溃,显示替代路径
永久拒绝不循环弹窗,可主动前往设置
设置后允许返回时重新查询并继续
设置后仍拒绝保持拒绝态,不伪造成功
窗口切换授权流程状态不丢失
功能取消不申请权限
能力不可用入口禁用并说明

权限测试必须使用真实系统返回,不能只模拟页面布尔值。

二十七、当前版本的发布核验

  • [ ]module.json5不含requestPermissions
  • [ ] 源码无运行时敏感权限申请;
  • [ ] 无 HTTP、Web 组件和联网业务;
  • [ ] 依赖中无统计、广告和推送 SDK;
  • [ ] 政策准确列出本地数据类型;
  • [ ] “清除数据”覆盖 Preferences 与 UI 快照;
  • [ ] 卸载后应用沙箱数据清除;
  • [ ] 政策入口无需登录且四次操作内可达;
  • [ ] 政策版本、生效日期和联系方式真实;
  • [ ] About、帮助页、应用描述与政策一致;
  • [ ] AGC 权限、SDK、联网与隐私字段一致;
  • [ ] release 包完成安装、启动、清除数据、重启和卸载冒烟。

二十八、功能变化时的变更门

以下变化必须重新执行权限与隐私审查:

  • 新增联网、账号、云同步或在线反馈;
  • 新增位置、相机、麦克风、通知或日历;
  • 新增分享、导出、备份和跨端同步;
  • 接入分析、广告、推送、登录或支付 SDK;
  • 将本地笔记发送给 AI 服务;
  • 收集设备标识、崩溃日志或性能数据;
  • 改变数据保存期限或删除方式。

变更门应发生在设计阶段,而不是提交审核前一天。

总结

权限与隐私合规的核心是“一份事实,多个表面”:产品功能决定数据和能力,module.json5只声明必要权限,运行时在用户触发时申请并处理拒绝,隐私政策说明真实数据生命周期,AGC 再如实复述同一事实。

“天体运行模拟”当前是一个边界清晰的离线应用:没有权限声明,没有网络调用,本地保存收藏、笔记、记录和设置,政策也提供删除说明。最重要的工作不是增加形式化弹窗,而是持续审计依赖和发布包、验证清除路径,并把任何新增能力作为重新评估权限、政策和上架字段的变更门。

本文唯一标记:CSDN-SERIES:ALL-163201235

AI 辅助声明:本文部分内容由 AI 辅助整理,源码事实、工程边界与验证结论均依据文中所列项目文件复核。本文没有执行新的构建、安装、真机、发布包或 AGC 回读,因此相关状态均不表述为已验证。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询