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

发布时间:2026/9/1 15:14:13
【天体运行模拟|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致 【天体运行模拟18】HarmonyOS ArkTS 权限与隐私实战让 module.json5、功能说明和拒绝路径一致权限合规最容易出现的错误不是忘记写一段隐私文案而是四个事实互相矛盾module.json5声明了权限代码没有对应功能页面说“完全离线”依赖却偷偷联网系统拒绝授权后功能仍反复弹窗AppGallery Connect 填写的数据处理范围又与应用内政策不同。审核人员看到的是整个产品行为不是某一个文件。“天体运行模拟”的真实module.json5没有requestPermissions字段源码扫描也没有发现网络请求、相机、麦克风、位置或通讯录权限申请PrivacyPolicyPage.ets明确说明应用完全离线本地保存模拟次数、学习时长、收藏 ID、观察笔记和偏好设置并提供“我的-设置-清除数据”路径。就当前版本而言它的正确策略不是设计复杂的授权弹窗而是持续证明“无敏感权限、无第三方 SDK、数据不离开设备”。本文面向 HarmonyOS 5.0 及以上版本基于真实源码建立权限与隐私核验流程并进一步说明如果未来新增相机、位置或联网能力应怎样让清单声明、运行时申请、拒绝路径、政策文本和 AGC 字段同步变化。项目基线应用版本1.0.0Bundle 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(): Promiseboolean { // 通过统一 PermissionService 检查和申请 // 返回授权结果不在页面散落系统 API return false }页面只处理结果PermissionService封装检查、申请和状态映射。这样权限逻辑可以集中测试也避免不同页面出现不同文案。十五、拒绝是正常业务分支用户拒绝授权不应被当成异常崩溃。页面至少区分type PermissionState | not_requested | granted | denied | restricted拒绝后提供可理解结果保留手动输入、允许使用系统 Picker、隐藏仅依赖该权限的动作或明确结束当前功能。不要立即再次弹窗也不要用“不给权限无法使用整个应用”诱导用户。十六、永久拒绝后不要循环申请当系统状态表明不能继续直接申请时页面应解释如何在系统设置中管理权限并让用户主动决定是否前往。返回应用后重新检查状态而不是假设已授权。async function resumeAfterSettings(): Promisevoid { const state await permissionService.getCameraState() this.permissionState state }跳转设置不是授权成功只有重新查询结果才是事实。十七、权限说明要具体到当前功能“为了提供更好的体验”不是合格理由。说明应包含对象与动作相机拍摄用户主动添加的观察记录位置显示当前位置对应的可见天体麦克风录制用户主动创建的语音笔记通知提醒用户设定的观察时间。若应用没有这些功能就不应出现这些说明或权限。十八、Picker 与敏感权限要区分选择单张图片、保存导出文件等场景优先评估系统 Picker。Picker 让用户明确选择具体内容通常比申请大范围媒体访问更符合最小化原则。但不能笼统宣称“Picker 永远不需要任何配置”。每个 Kit、目标版本和使用场景都应查官方文档并验证取消、无可用应用、文件损坏和窗口化返回路径。十九、网络权限会改变整个隐私模型当前政策明确“不需要联网”“不会上传”。未来一旦添加 HTTP API、云同步、在线反馈、分析或广告就不只是加一个INTERNET权限离线描述需要修改数据接收方和处理目的需要说明服务域名与安全策略需要审查错误和断网状态需要实现第三方 SDK 清单需要更新AGC 隐私字段需要重新填写删除账号、撤回同意等权利可能进入范围。网络能力属于发布前重新触发合规审查的重大变化。二十、第三方 SDK 不能只看 importSDK 可能通过构建依赖、HAR、原生库或插件接入。审计需要检查oh-package.json5与锁文件模块依赖和原生库SDK 初始化代码网络域名与后台行为SDK 自身权限和数据类型是否在用户同意前初始化政策中是否说明名称、提供方、目的和数据。当前政策称“未集成任何第三方统计、广告或推送 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-163201235AI 辅助声明本文部分内容由 AI 辅助整理源码事实、工程边界与验证结论均依据文中所列项目文件复核。本文没有执行新的构建、安装、真机、发布包或 AGC 回读因此相关状态均不表述为已验证。