关于页、用户协议与隐私政策:个人开发者最小合规落地
合规工作的特点是做少了审核打回做多了纯属自嗨个人开发者没有法务。我们按审核要什么、用户要什么、多了不要划出一条最小线落地为设置里的「关于」区 两份法律文本 隐私清除入口。这篇是完整清单顺带把背后的鸿蒙机制讲透——合规文案不是孤立的文案每一处都对应一个系统 API 或配置项。1. 关于页七要素「关于」区的内容是枚举出来的七项产品中文名、版本号、版权行完整法律主体、品牌简称、麦克风用途说明、用户协议入口、隐私政策入口外加第三方致谢。每一项都对应一条审核或信任逻辑产品中文名只用「开口练」。代码名SpeakLab永远不出现在用户可见处——这条在项目红线里关于页是最后的防线版权行用完整登记主体© 2026 琼海享时科技工作室个人独资不能用品牌简称替代。审核对开发者主体和应用内声明主体一致性是会比对的麦克风用途说明逐字复用权限声明。关于页写的用途和module.json5里权限声明的reason系统权限弹窗与系统设置页给用户看的理由语义必须一致——两处说法不一是典型的审核疑点/** * 麦克风用途说明须与 string.json sl_mic_reason 语义一致逐字复用。 */ export const SPEAKLAB_MIC_REASON: string 用于将您的语音实时转为文字以便练习表达并高亮分析口癖词;致谢要诚实词库来源大连理工大学情感词汇本体库、原项目致谢基于 expression-trainersisiMIT理念重构本应用为独立产品并非原应用的直接上架版本。MIT 许可要求保留声明而并非原应用的直接上架版本这句主动划清界限是避免与原版产品产生应用市场混淆的自我保护。2. 鸿蒙权限声明机制为什么逐字复用是审核点展开讲讲上一条里的reason到底在哪。鸿蒙 Stage 模型里用户授权类user_grant权限要在module.json5里显式声明{ module: { requestPermissions: [ { name: ohos.permission.MICROPHONE, reason: $string:sl_mic_reason, // 用户可见的用途说明走资源索引 usedScene: { abilities: [EntryAbility], when: inuse } } ] } }三个字段各有审核含义name决定你申请的权限等级麦克风是 user_grant必须运行时向用户申请代码里走abilityAccessCtrl.createAtManager().requestPermissionsFromUser(...)reason是字符串资源引用审核人员和用户都能在系统权限设置页看到它usedScene声明使用场景when: inuse表示仅前台使用期——这和 B12 讲的foreground 不自动采麦是同一承诺的两面。理解了这套机制关于页文案逐字复用 reason的必要性就具体了审核者会对照系统权限设置里的用途说明、应用内关于页的说法、以及市场后台填的隐私声明三处。三处措辞漂移轻则要求说明重则认定权限用途描述与实际不符打回。所以我们的做法是把用途文案常量化让三处引用同一句话而不是各写各的。另外权限被拒的降级路径引导去系统设置开启、不闪退不卡死也是审核实测项不是可做可不做。3. 版本号同源一处真相门禁比对关于页显示的版本号来自常量/** 与 AppScope/app.json5 versionName 一致升版时同步改此处 app.json5。门禁会比对。 */ export const SPEAKLAB_VERSION_NAME: string 1.0.0; export const SPEAKLAB_VERSION_CODE: number 1; export const SPEAKLAB_VERSION_DISPLAY: string 1.0.01;有人问鸿蒙不是有运行时 API 吗确实有——bundleManager.getBundleInfoForSelf()可以拿到versionName/versionCode一行代码永远不用手工同步。我们为什么不用因为关于页显示的版本应该是声明出来的契约而不是碰巧读到的值显示层的 bug读错 flag、格式拼错、异步时序导致首帧为空应该被测试抓住而不是静默显示一个错版本或空版本。常量与AppScope/app.json5的一致性由门禁check-p7-about-legal.sh比对升版时漏改任何一处门禁红。B17 的原则再次出现靠同步纪律的不如靠自动比对。4. 协议全文rawfile 应用内展示用户协议和隐私政策两份全文以纯文本放在resources/rawfile/sl_user_agreement.txt/sl_privacy_policy.txt应用内 Sheet 全文展示不跳外链。这个选择的审核逻辑外链协议页面在审核时可能打不开、内容可能与应用内声明不一致、且个人开发者很难保证链接永久有效。打进包里的文本随版本固化审核看到的就是用户看到的。技术上 rawfile 放法律文本是门当户对的选择rawfile 目录下的文件不进资源索引、不参与编译期校验按原样打进 HAP正好适合内容很长、不需要按语言/分辨率限定、不需要被代码按 ID 引用的纯文本。读取走getContext(this).resourceManager.getRawFileContent(...)也有同步版getRawFileContentSync这和 B07 词库加载器是同一套 API——词库、法律文本两类打包带走的只读资产共享同一条加载路径。加载层姿态也与词库同款I/O 失败返回空串UI 降级显示加载失败提示不抛业务异常——法律文本加载失败不该 crash但也不该假装显示了。隐私政策的内容与前面所有篇目的技术决策一一对应麦克风只用于实时转写、不存音频B10、Key 仅内存Asset/vaultB15、历史仅存本地沙箱B09、设置可清除。写隐私政策的最佳时机是架构冻结之后——它是技术决策的复述不是文学创作。架构里没有的能力比如我们不会上传您的语音写起来才毫不心虚。5. 隐私与数据入口合规的最后一块是用户的数据控制权。鸿蒙应用的数据天然住在应用沙箱里filesDir、Preferences 都在沙箱内卸载即清但卸载即清不等于合规完成——监管和审核要求的是应用内可操作的删除入口。我们在设置里提供「隐私与数据」区历史记录清除删speaklab_history目录B09、个性化设置清除Preferences 四字段、API Key 清除双清内存Asset/vaultB15。每个通道对自己的数据负全责清除动作有确认对话框和完成反馈。这些入口既是合规要求用户有权删除其数据也是前面各篇通道自治设计的自然出口——通道自治的架构让按通道删除几乎不用额外设计。6. 最小合规清单可抄关于页中文名 / 版本常量门禁同源/ 完整主体版权行 / 权限用途与module.json5的 reason 逐字一致权限user_grant 权限声明 reason usedScene 齐全运行时申请有拒绝降级路径用户协议 隐私政策rawfile 全文应用内展示加载失败有降级第三方致谢许可要求的声明 与上游的关系澄清数据控制入口历史 / 设置 / 凭据三类清除有确认有反馈全部文案常量化门禁比对版本与关键语义7. 小结合规最小线 审核要的 用户要的多了不要每要素对应一条审核逻辑。权限用途文案与module.json5reason 逐字复用审核会对照系统设置、关于页、市场声明三处。版本号常量声明 门禁与 app.json5 比对不用运行时 bundleManager 读因为显示层 bug 该被测试抓。rawfile 不进资源索引、原样打包是法律文本的门当户对隐私政策是技术决策的复述。沙箱卸载即清不替代应用内删除入口按通道清除是通道自治架构的自然出口。
