资讯详情

资讯详情

【细胞工坊|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致

本文基于「细胞工坊」真实 HarmonyOS ArkTS 源码编写源码目录为D:\huawei\one14-9重点复核entry/src/main/module.json5、views/mine/PrivacyPolicyPage.ets、views/mine/SettingsPage.ets、utils/DataStore.ets和views/mine/AboutPage.ets。源码显示当前应用未在module.json5中声明联网、位置、相机、麦克风、通讯录等敏感权限隐私政策和关于页都声明应用离线运行、不收集个人信息、数据仅保存在 HarmonyOS Preferences设置页提供“清除实验数据”和“清除缓存”的二次确认路径。本文只讨论这些真实实现不虚构运行时权限申请、权限拒绝弹窗或第三方 SDK 行为。一、权限与隐私问题最怕“代码、文案、入口”三处不一致HarmonyOS 应用准备上架时权限与隐私不是单独填一段说明就结束。审核真正关注的是module.json5有没有声明权限应用功能是否确实需要这些权限隐私政策有没有说明数据处理方式用户能不能找到清除或撤回路径页面文案是否和实际代码一致。实际项目里常见的风险不是“忘记写隐私政策”而是几处材料互相打架。比如模块声明里没有联网权限但关于页写了“云端同步”功能页没有相机能力却在隐私政策里泛泛写“可能访问相机”本地保存了笔记和收藏但没有告诉用户保存在哪里、如何清除。任何一处不一致都可能让审核人员怀疑应用存在隐性数据处理。「细胞工坊」这篇 05-18 的重点是把权限声明、隐私说明、本地存储和清除路径放到同一条证据链里看。这个应用的真实源码更接近“离线教育工具”没有声明敏感权限实验记录、收藏、笔记和统计数据通过 Preferences 保存在本机隐私政策明确不上传、不共享、不集成统计广告推送 SDK设置页提供清除入口。二、先看 module.json5没有权限声明就是第一层边界权限审计要先从entry/src/main/module.json5开始。这个文件定义模块类型、入口 Ability、设备类型和技能声明。当前源码中module下没有requestPermissions字段也没有声明ohos.permission.INTERNET、位置、相机、麦克风、通讯录、相册等权限。{ module: { name: entry, type: entry, mainElement: EntryAbility, deviceTypes: [phone, tablet, 2in1], abilities: [ { name: EntryAbility, srcEntry: ./ets/entryability/EntryAbility.ets, exported: true } ] } }这段配置能支持文章中的一个核心判断当前应用不是“申请权限后再做功能”的架构而是“无敏感权限也能完成核心流程”的架构。对细胞实验模拟、知识学习、收藏、笔记和本地记录来说这个边界是合理的。但这里也有一个写作边界没有权限声明不等于可以写成“已经处理了权限拒绝路径”。源码里没有看到运行时权限申请也就不存在用户拒绝相机、定位、麦克风后的业务兜底。更准确的说法是当前版本通过不申请敏感权限把权限拒绝路径降到了最低只需要处理本地数据不可用、Preferences 初始化失败、清除失败等本地异常。三、隐私政策页把“不收集”和“本地保存”写成可核对条款PrivacyPolicyPage.ets是用户可见的隐私说明入口。页面内容分成版本信息、概述、不收集的信息、本地存储的信息、权限使用、第三方 SDK、未成年人保护、用户权利、政策更新和联系方式。它不是空泛声明而是把“收集什么、不收集什么、保存在哪里、如何清除”都列出来。this.Section(四、权限使用, 本应用不申请任何敏感系统权限无需联网、无需位置、无需通讯录、无需相机麦克风等权限即可正常运行。)这句话必须和module.json5保持一致。当前源码中确实没有权限声明所以它是可复核的。如果未来添加联网、相机、文件读取或推送能力这段隐私政策就必须同步调整否则文案会变成审核风险。隐私政策页还声明本地保存的数据范围包括实验次数、累计学习时长、收藏的实验 ID、手动创建的实验笔记和偏好设置。这些内容能在DataStore.ets中找到对应键例如favorite_experiments、experiment_records、user_notes、experiment_count、learning_seconds、learning_minutes。这就是“隐私文案和真实存储键可对上”的证据。四、DataStore本地 Preferences 是隐私承诺的实现层隐私政策如果说“数据只保存在本机”代码里就应该能看到本地存储实现而不是隐藏网络上传。DataStore.ets引入的是kit.ArkData的preferences并通过preferences.getPreferences(context, PREF_NAME)获取本地 Preferences 实例。PREF_NAME为bio_lab_app_data这是应用沙箱内的轻量数据存储。import { preferences } from kit.ArkData import { common } from kit.AbilityKit const PREF_NAME bio_lab_app_data export class DataStore { private static prefInstance: preferences.Preferences | null null static async init(context: common.UIAbilityContext): Promisevoid { try { DataStore.prefInstance await preferences.getPreferences(context, PREF_NAME) await DataStore.refreshStatsSnapshot() } catch (_) { DataStore.prefInstance null } } }这段代码的边界很清楚DataStore只在拿到UIAbilityContext后初始化 Preferences失败时把实例置空。它没有网络客户端、没有上传接口、没有第三方 SDK 初始化。隐私政策里的“不会离开您的设备”在当前源码范围内是能被支撑的。同时这里也要看到实现风险多个catch (_) {}会吞掉异常。对用户体验来说这能避免页面崩溃对工程排查来说可能导致本地数据不可用时缺少日志。文章不能把它写成完美隐私架构只能说它完成了本地存储闭环后续可以增加非敏感的错误状态反馈或本地调试日志。五、存储键要和隐私政策的“本地数据范围”对齐隐私政策页列出了本地保存内容DataStore.ets中也定义了对应的本地数据键。这个对应关系很重要因为审核和用户都不关心你用了哪个类名他们关心的是“你到底保存了什么”。const LOCAL_DATA_KEYS: string[] [ favorite_experiments, experiment_records, user_notes, experiment_count, learning_seconds, learning_minutes ]这些键对应收藏、实验记录、用户笔记、实验次数和学习时长。它们没有直接保存姓名、手机号、位置、设备标识、通讯录、相册或录音等敏感信息。结合module.json5无敏感权限声明可以形成一个比较稳定的结论当前版本的数据处理是本地学习记录和偏好数据不是个人身份信息收集。如果后续新增“反馈上传”“账号登录”“云端同步”“学习报告分享”这张键表就不够了。那时需要重新定义数据分类、上传目的、服务器位置、保留期限、用户删除路径和隐私政策条款。技术文章必须把当前版本和未来可能扩展的边界分开。六、设置页隐私权利不能只写在政策里还要有入口隐私政策页写了“可以在我的-设置-清除实验数据中清除本地保存数据”。这句话在SettingsPage.ets中可以找到真实入口。设置页提供“清除实验数据”和“清除缓存”两项并都使用AlertDialog.show做二次确认。private async clearExperimentData(): Promisevoid { AlertDialog.show({ title: 清除实验数据, message: 将清除您本机保存的实验记录、收藏、笔记和统计数据且不可恢复。是否继续, secondaryButton: { value: 确定清除, fontColor: AppColors.ACCENT_RED, action: async () { await DataStore.putString(favorite_experiments, []) await DataStore.putString(experiment_records, []) await DataStore.putString(user_notes, []) await DataStore.putNumber(experiment_count, 0) } } }) }这段代码实现了两个合规点。第一清除是用户主动点击触发不是隐藏行为。第二清除前有明确提示“不可恢复”降低误操作风险。对本地教育应用来说这比只在隐私政策里写“您可以删除数据”更有说服力。源码还提供了clearCache()它会调用DataStore.clearCache()删除LOCAL_DATA_KEYS中的本地数据并刷新页面上的缓存大小。这样用户看到的不只是一个按钮而是一个可反馈的操作路径。七、DataStore.clearCache删除路径要覆盖声明过的数据清除入口是否可靠最终要看底层删除是否覆盖隐私政策声明过的数据。DataStore.clearCache()会遍历LOCAL_DATA_KEYS逐个调用prefInstance.delete(key)最后flush()并把 AppStorage 中的统计快照重置为 0。static async clearCache(): Promisevoid { if (!DataStore.prefInstance) return for (let i 0; i LOCAL_DATA_KEYS.length; i) { const key LOCAL_DATA_KEYS[i] try { await DataStore.prefInstance.delete(key) } catch (_) { } } await DataStore.prefInstance.flush() AppStorage.setOrCreatenumber(favorite_count, 0) }这里的工程重点不是for循环而是清除范围来自同一张LOCAL_DATA_KEYS表。只要本地数据新增时同步维护这张表设置页的清除能力就不容易漏数据。相反如果某个新功能把数据存在另一个 Preferences、文件目录或数据库里却没有加入清除路径就会出现“隐私政策承诺可清除但实际仍有残留”的问题。当前代码还有改进空间clearExperimentData()使用多次putString和putNumber重置clearCache()使用delete删除。两者语义略有差异。对用户来说都能清理主要数据对工程一致性来说后续可以统一到一个DataStore.clearUserLearningData()由设置页两个入口复用。八、关于页合规说明要和隐私政策互相印证AboutPage.ets中有“合规与隐私”区块写明应用为单机离线应用、未声明联网权限或任何敏感权限、不申请位置通讯录相机麦克风、不收集上传个人信息、实验数据仅保存在本机 Preferences、未集成第三方统计广告推送 SDK。这类关于页说明不是替代隐私政策而是帮助用户在应用介绍层快速理解边界。它和PrivacyPolicyPage.ets的内容应该保持一致。当前源码中两者方向一致都强调离线、本地、无敏感权限、无第三方 SDK。Text(• 本应用为单机离线应用全部核心功能可在本机完成无需连接公共互联网。\n • 应用未声明联网权限或任何敏感权限不申请位置、通讯录、相机、麦克风权限。\n • 不收集、上传任何个人信息实验数据仅保存在本机应用沙箱内HarmonyOS Preferences。)发布前要注意一个细节同一类合规文案分布在隐私政策、关于页、用户协议、应用市场描述、审核备注中。只要未来能力变化就必须同步更新所有入口。否则很容易出现“隐私政策说不联网市场描述说支持在线反馈”的冲突。九、权限拒绝路径当前版本的正确表述是“不申请敏感权限”队列标题里有“拒绝路径一致”的方向但源码里没有运行时权限申请逻辑。因此05-18 这篇文章不能写“用户拒绝权限后如何降级”只能写“当前版本通过不申请敏感权限让核心功能不依赖权限授权”。这是更符合源码的表达。如果未来要新增权限拒绝路径应当遵循三条规则。第一申请前说明场景例如“导入图片识别细胞结构”才需要相册或文件访问。第二拒绝后功能要可返回、可继续使用其他模块而不是卡死。第三隐私政策、关于页、module.json5 和功能说明必须同步更新。对当前代码来说需要验证的是另一类失败路径Preferences 初始化失败时页面是否继续可用清除数据失败时是否给出 Toast本地数据为空时列表是否展示空态设置页二次确认是否能取消。这些才是当前版本真实存在的隐私与数据控制路径。十、发布前本地审计清单针对「细胞工坊」当前版本可以用下面这张清单做上架前自查。检查项当前源码证据结论是否声明联网权限module.json5未见ohos.permission.INTERNET隐私页“无需联网”有源码支撑是否声明敏感权限module.json5未见位置、相机、麦克风、通讯录等权限“不申请敏感权限”成立是否说明本地数据范围PrivacyPolicyPage.ets列出实验次数、学习时长、收藏、笔记、偏好文案具体是否有本地存储实现DataStore.ets使用 HarmonyOS Preferences与本地保存声明一致是否提供清除入口SettingsPage.ets提供清除实验数据和清除缓存用户可控是否集成第三方 SDK已读源码未发现统计、广告、推送初始化当前文章不声称存在 SDK这张表的作用是把“合规”变成可复核项。写文章、填市场材料、准备审核说明时都可以从这里反查。如果某项找不到源码证据就不要写成已实现。十一、常见问题与修复方向问题风险修复方向隐私政策写“离线”代码后续加了联网能力审核材料与实际行为不一致同步更新module.json5、隐私政策、关于页和市场描述新增本地数据键但没有加入清除列表用户清除后仍可能残留数据把新键加入统一LOCAL_DATA_KEYS并复用统一清除方法清除失败被静默吞掉用户以为清理成功但实际失败保留 Toast 兜底必要时增加本地错误状态关于页和隐私政策表述不同用户和审核无法判断真实行为维护一份合规文案源再分发到页面和材料未来新增权限但无拒绝态用户拒绝权限后功能卡死权限申请前说明用途拒绝后保留可返回和可继续路径这些问题不需要过度设计。当前版本最重要的是守住“无敏感权限、本地保存、可清除、文案一致”四件事。只要新增能力就按这四件事重新审计。十二、结论权限少不是卖点声明一致才是工程质量基于D:\huawei\one14-9的真实源码05-18 能得出的结论是细胞工坊当前版本没有在module.json5中声明敏感权限隐私政策页和关于页明确说明应用离线、不收集个人信息、数据保存在本机 PreferencesDataStore使用 HarmonyOS Preferences 管理收藏、记录、笔记和学习统计设置页提供清除实验数据和缓存的二次确认路径。这套实现的价值不是“权限越少越好”这么简单而是让模块声明、用户可见文案、数据存储和用户控制入口互相印证。对 HarmonyOS 5.0 应用来说权限与隐私的技术质量不是写在某个单独页面里的承诺而是每个声明都能回到源码每个本地数据都有清除路径每个未来新增能力都能同步更新配置和说明。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →