资讯动态

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

发布时间:2026/8/19 13:53:05 来源:尧图企业网站定制
权限与隐私最容易出现的审核问题往往不是“权限申请得太多”这么简单而是代码、配置、页面文案和上架材料各说各话。module.json5声明了网络权限产品说明却写成完全离线设置页显示“提醒已设置”工程里却没有通知调度页面提示数据已清除持久化异常却被静默吞掉。这些细节单独看都不大合在一起就会让审核人员无法判断应用真正做了什么。知律当前是一个面向 HarmonyOS 5.0 及以上版本的本地法律学习应用。源码中的题库、收藏、笔记、错题、学习进度和考试记录都可以复核同时练习页的语音功能会先创建离线 TTS 引擎失败后再尝试在线引擎。也正因为这条在线兜底存在ohos.permission.INTERNET不能被当成“多余配置”但也不能被扩写成账号、云同步或远程题库能力。本文基于D:\huawei\one19-11的真实源码重点复核entry/src/main/module.json5、EntryAbility.ets、Index.ets、HomePage.ets、PracticePage.ets、SettingsPage.ets与UserDataManager.ets。包名com.jiaweikang.one19是本文草稿回读时使用的唯一标记。全文只描述源码中能确认的行为对在线 TTS 的具体数据处理范围、系统服务边界和网络实现不做未经官方文档或真机证据支持的推断。本文会解决五个实际问题从功能调用反推权限而不是先堆一张权限表解释 INTERNET 为什么存在以及它不代表什么区分权限拒绝、能力不可用和持久化失败把本地学习数据、清理入口与隐私材料对齐找出工程中仍会影响上架审核的一致性风险。一、先画出四份必须一致的事实权限审计不应只打开module.json5看一眼。真正需要相互校验的是四份事实事实来源需要回答的问题知律当前证据产品功能用户能触发什么本地题库、练习、收藏、笔记、错题、统计、TTS系统 API代码实际调用什么Preferences、TTS、窗口与路由能力模块配置安装包声明什么INTERNET无相机、麦克风、位置等敏感权限用户与审核材料对外怎样说明本机存储、网络用途、删除方式、无账号与无云同步只要其中一列变化其他三列就要重新检查。例如以后加入云端题库不能只补 HTTP 请求还要更新隐私政策、网络用途、数据处理说明和离线失败路径。二、module.json5 的真实权限面很小当前 entry 模块只声明一项权限requestPermissions: [ { name: ohos.permission.INTERNET } ]源码没有声明相机、麦克风、位置、联系人、短信、日历或媒体读取权限也没有发现requestPermissionsFromUser()一类运行时索权代码。首页和主导航只是组合本地页面、题库数据与学习记录没有启动时集中申请权限的逻辑。这里要避免两个相反误判不能因为只有 INTERNET 就写成“零权限应用”也不能因为存在 INTERNET 就宣称应用具备远程题库、云同步、在线排行或账号服务。权限只能证明模块被允许使用对应系统能力不能替代对真实调用路径的说明。三、INTERNET 对应的是在线 TTS 兜底练习页导入了 HMS 文本转语音能力import textToSpeech from hms.ai.textToSpeech初始化时先尝试离线引擎this.ttsEngine await textToSpeech.createEngine({ language: zh-CN, person: 0, online: 0 })只有离线创建失败才进入第二条路径this.ttsEngine await textToSpeech.createEngine({ language: zh-CN, person: 0, online: 1 })因此当前源码中最明确的网络意图就是在线 TTS 回退。INTERNET 只服务于在线 TTS 兜底这是现阶段能够从配置与调用链共同确认的边界工程中没有普通 HTTP 客户端、Web 组件、账号接口或远程题库下载代码。上架说明可以写“语音示例优先使用设备离线语音能力在离线引擎不可用时可能尝试在线语音服务”但是否需要进一步披露文本处理、服务提供方和网络条件应以对应 TTS Kit 的官方说明及真机抓取结果为准不能凭经验补写。四、TTS 不等于录音不需要麦克风文本转语音的输入是应用已有的题目文本输出是合成语音。它不录制用户声音所以当前没有ohos.permission.MICROPHONE是合理的。这一点直接影响失败文案。如果播放失败页面不能提示“请允许麦克风权限”因为这会把无关权限引入产品认知也会诱导开发者错误地增加权限。当前源码使用的文案是当前设备语音引擎不可用 语音播放失败请检查系统语音服务这比“请开启录音权限”准确。更完整的文案还可以补充文字提示仍可查看答题流程不受影响。五、当前没有运行时权限拒绝回调标题中的“拒绝路径”需要按实际权限类型理解。知律没有请求相机、位置等需要用户在运行时选择允许或拒绝的敏感权限因此源码中没有真实的授权对话框也没有granted、denied、blocked等授权状态。当前实际存在的是三类失败设备没有可用的离线或在线 TTS 引擎TTS 引擎创建成功但播放回调返回错误Preferences 初始化或写入失败。它们都不应被叫作“用户拒绝权限”。术语准确很重要因为排查动作完全不同权限拒绝要检查授权状态TTS 不可用要检查系统服务和设备能力持久化失败则要检查存储初始化与写入结果。六、语音能力已经有不阻断主流程的降级用户点击听音题时toggleAudioPreview()先打开文字弹窗再后台尝试语音this.audioDialogText this.audioText(question) this.audioDialogStem question.stem this.showAudioDialog true const ready await this.ensureTtsEngine() if (ready this.ttsEngine) { this.ttsEngine.speak(this.audioText(question), { requestId: ${question.id}_${Date.now()} }) }这条顺序设计得很稳。即使引擎创建失败用户仍然能看到题干或发音提示继续完成答题。它满足三个审核友好的原则用户主动点击后才触发语音失败有可见状态附加能力失败不阻断核心学习流程。还可以改进的一点是空catch。错误日志不应包含完整题目或用户笔记但可以记录非敏感错误码和阶段例如offline_engine_create_failed帮助区分离线资源缺失与在线服务失败。七、本地数据并不少不能写成“不存储数据”知律不要求登录也没有云同步但会处理多类设备内学习数据。UserDataManager通过 Preferences 保存键数据内容用户价值favoriteRecords收藏题目 ID、题库 ID、时间收藏复习noteRecords题目笔记文本个性化学习记录wrongRecords错题与时间错题复盘bankProgress已答数、正确数、章节学习进度chapterProgress章节完成统计章节追踪examHistory分数、题量、用时模拟考试记录dailyReminderTime提醒时间偏好设置显示examDurationSec考试时长模拟考试配置autoNextQuestion自动下一题开关交互偏好隐私材料应写“学习数据保存在本机”而不是“应用不存储任何数据”。本地存储仍然是数据处理只是当前没有证据表明这些数据会上传或分享。八、Preferences 集中封装让审计更容易EntryAbility.onCreate()在应用启动时初始化数据层UserDataManager.init(this.context)随后UserDataManager从 Preferences 读取 JSON再写入 AppStorageUserDataManager.prefs preferences.getPreferencesSync(context, { name: UserDataManager.STORE_NAME }) AppStorage.setOrCreateFavoriteRecord[]( favoriteRecords, JSON.parse(favStr) as FavoriteRecord[] )页面只通过管理器更新数据避免每个页面直接散落存储调用。这种结构让权限与隐私审计可以沿着一条稳定链路进行页面操作 - UserDataManager - Preferences - AppStorage - 页面刷新不过存储名仍是dialect_quiz而应用已经是知律。这不会直接改变数据范围却说明项目迁移时留下了旧产品命名。发布前应把这类标识纳入一致性检查并在需要迁移旧数据时设计兼容读取不能直接改名导致用户记录丢失。九、用户笔记是隐私审计的重点收藏和错题主要是应用生成的结构化记录笔记则是用户自由输入文本。用户可能在笔记中写入姓名、联系方式、案件线索或其他个人内容即使应用没有主动要求也不能把它当成普通统计值。当前源码把笔记保存在本机没有上传、分享和云同步代码。更稳的工程边界是不把笔记正文写入 hilog不在异常信息中拼接完整笔记默认不导出、不上传提供删除入口未来增加备份、分享或同步时重新做隐私评估对导出内容提供范围预览和明确的用户触发。技术文章和商店材料只能说明现有边界不能把“未来可能支持”写成已经具备的能力。十、清除全部数据有二次确认设置页的清理动作不是一次点击立即执行。第一次点击将pendingClear设为true第二次才调用this.favRecords UserDataManager.clearFavorites() this.noteRecords UserDataManager.clearNotes() this.wrongRecords UserDataManager.clearWrong() this.progressList UserDataManager.clearProgress() this.chapterProgressList UserDataManager.clearChapterProgress() this.examHistory UserDataManager.clearExamHistory()二次确认降低了误删风险清理范围也覆盖了主要学习记录。需要注意的是学习设置键没有在“清除所有学习数据”中重置提醒时间、考试时长和自动下一题仍会保留。这不一定是错误但产品说明必须明确“清除学习记录”还是“恢复全部设置”。两个动作的范围不同按钮文案和审核说明不能混用。十一、删除成功提示目前缺少落盘证据persist()使用同步写入和刷新UserDataManager.prefs.putSync(key, JSON.stringify(value)) UserDataManager.prefs.flushSync()但异常被空catch吞掉try { // 写入与刷新 } catch (_) {}清理方法无论写入是否成功都会返回空数组页面随后显示“所有学习数据已清除”。这会产生一种隐私风险当前界面看似清空应用重启后旧数据可能重新出现。更稳的方案是让持久化层返回结果interface PersistResult { success: boolean reason?: string } function clearLearningData(): PersistResult { // 全部键写入成功后才返回 success return { success: true } }页面只有在磁盘写入确认成功后才显示完成失败时保留明确提示并允许重试。隐私删除的验收标准不是“列表瞬间变空”而是重启后仍为空。十二、“每日学习提醒”目前只是偏好值设置页允许选择提醒时间并调用UserDataManager.saveDailyReminderTime(value)但是当前源码没有通知发布、提醒代理、定时任务或通知授权逻辑。也就是说页面只是保存了一个时间字符串并没有在指定时间真正提醒用户。因此“每日学习提醒已设置为 09:00”会让用户误以为系统调度已经完成。发布前有两种真实选择改成“提醒时间偏好”明确当前只保存设置完成真实提醒实现再同步权限、授权时机、拒绝路径和隐私说明。不能为了让文案看起来完整而提前申请通知权限。权限应在功能真实交付后、用户主动开启提醒时按需处理。十三、HomePage 与 Index 没有隐藏索权Index.ets负责手机底部导航和宽屏侧边导航HomePage.ets负责本地题库、学习统计和每日一题。两者都没有权限请求、网络调用或 Web 内容加载。这个事实很适合写进首次启动验收启动页不应出现批量权限框首页在飞行模式下应正常展示本地题库和学习记录不依赖账号切换 phone、tablet、2in1 布局不应触发额外能力只有用户主动点击语音时才进入 TTS 路径。把能力触发点缩到用户动作附近比在EntryAbility中提前初始化所有服务更容易解释和测试。十四、资源与包描述出现旧产品残留权限一致性之外当前工程还有一个更直接的上架材料风险entry/oh-package.json5和根oh-package.json5的描述仍写着“中国方言题库”而 AppScope 的正式包名是com.jiaweikang.one19应用内容和页面品牌是知律。类似残留还包括 Preferences 存储名dialect_quiz。这些值未必全部展示给用户但会让代码审计、依赖包说明和后续维护产生混淆。发布前至少应对照AppScope 应用名与图标bundleName、versionName、versionCodeentry 模块描述与 Ability 标签oh-package 名称、描述、作者应用内“关于”页面AGC 标题、简介、分类与截图隐私政策中的产品名和包名。上架审核看的是完整产品而不是只看首页截图。十五、在线 TTS 让“数据保存在本机”需要限定语境设置页点击“框架”后提示页面采用 ArkTS 与 ArkUI 构建数据保存在本机。对收藏、笔记、错题和学习进度而言这句话有源码依据。但在线 TTS 会接收应用提供的待合成文本具体由哪个进程或服务处理、是否经过网络、保存多久需要依据官方文档和实际服务行为确认。所以更严谨的表达是收藏、笔记、错题、进度和考试记录保存在本机语音示例优先使用离线引擎在线语音兜底的处理方式以系统服务说明为准。这种按数据类别拆分的说明比一句“全部数据都只在本地”更经得起复核。十六、第三方与平台 Kit 要分开说明entry 的包依赖只有本地librarya和libraryb没有广告、统计、登录或支付 SDK。但PracticePage直接使用hms.ai.textToSpeech它仍然属于需要在能力清单中说明的平台服务。依赖审计应覆盖oh-package.json5和锁文件ArkTS importHAR/HSP原生 soSDK 初始化代码网络域名和 AGC 服务开关隐私政策中的第三方或平台服务列表。“没有外部 npm 包”不等于“没有任何平台服务”。对外材料应按真实依赖类型准确分类。十七、未来新增敏感权限时的状态模型当前知律不需要运行时敏感权限因此不应为了通用性硬塞授权框架。若以后增加相机扫描、文件导入或位置能力可以再引入明确状态type PermissionState | not_requested | granted | denied | blocked | unavailable页面处理应与用户动作绑定状态页面行为not_requested在功能入口解释用途granted执行对应能力denied保留降级功能不重复骚扰blocked提供一次系统设置引导unavailable隐藏入口或说明设备不支持授权失败不能阻断题库、笔记和错题等无权限功能也不能在启动时连续弹出。十八、把权限回归检查放进发布流水线权限与隐私不是写完一次报告就结束。每次新增 Kit、依赖或页面入口都可能扩大数据与权限面。可以在发布脚本中加入最小扫描rg -n requestPermissions|ohos.permission entry/src/main rg -n hms|kit.NetworkKit|requestPermissionsFromUser entry/src/main/ets rg -n http|Web\\(|fetch\\(|socket|cloud|push entry/src/main/ets扫描结果不能代替人工判断但能发现变更。新增 INTERNET、CAMERA、LOCATION、通知、账号、推送或第三方 SDK 时应强制更新权限清单数据流图失败与拒绝路径隐私政策AGC 数据安全与 SDK 字段真机测试用例。十九、真机验证矩阵权限与隐私的验收必须覆盖“配置正确”和“失败可用”两方面场景预期结果首次启动不弹相机、麦克风、位置等无关权限框飞行模式进入首页本地题库、统计和导航可用飞行模式点击语音离线引擎可用则播放否则显示文字降级在线 TTS 可用仅用户点击语音后触发TTS 服务异常不崩溃答题可以继续新建笔记后重启笔记仍存在清除全部学习数据二次确认后主要学习记录为空清除后杀进程重启已删除记录不恢复设置提醒时间不能把仅保存偏好宣传为已调度通知卸载重装本地学习记录不应自动恢复如果某项无法在当前设备验证应记录为“未验证”不能写成已经通过。二十、上架前权限与隐私核对表[ ]module.json5只声明实际需要的 INTERNET[ ] 没有误加麦克风、相机、位置等权限[ ] 首次启动不请求无关权限[ ] 在线 TTS 的用途、触发时机和说明一致[ ] 不把 TTS 错误描述成麦克风权限拒绝[ ] 收藏、笔记、错题、进度和考试记录列入本地数据说明[ ] 用户笔记不上传、不写日志[ ] 清除范围与按钮文案一致[ ] 清除结果经过重启验证[ ] 每日提醒未实现调度时不宣称系统通知[ ] 无账号、云同步、广告和支付时不勾选对应能力[ ]中国方言题库、dialect_quiz等旧命名已评估并清理或迁移[ ] AppScope、模块描述、关于页、AGC 和隐私政策产品名一致[ ] 安装、启动、核心流程、退出和卸载正常[ ] 平台服务清单包含实际使用的 TTS Kit。二十一、常见问题排查症状先查哪里正确处理审核质疑为何联网PracticePage 的 online TTS说明用途并核对官方数据处理规则页面提示麦克风授权错把 TTS 当录音删除无关权限和误导文案飞行模式语音失败设备无离线引擎保留文字提示不阻断答题清空后重启数据回来persist()异常被吞掉返回落盘结果失败时提示重试提醒时间到了没通知只保存 Preferences完成真实调度或修改产品文案隐私政策写“不存数据”忽略本地学习记录按 Preferences 键逐项说明材料出现旧产品名项目迁移残留全量核对 AppScope、模块和包描述宣称云同步或在线排名没有服务端实现删除未实现能力宣称启动时批量索权权限申请位置错误改为用户触发功能时按需申请二十二、总结权限少不代表说明可以简单知律当前的权限面并不复杂模块声明 INTERNET主要用于离线 TTS 失败后的在线语音兜底没有相机、麦克风、位置等敏感权限也没有启动时运行时索权。收藏、笔记、错题、学习进度、章节进度、考试历史和设置通过 Preferences 保存在本机设置页提供二次确认的学习数据清理入口。真正需要在上架前继续收紧的是事实一致性在线 TTS 与“本机数据”说明要按能力拆分清理成功必须以真实落盘结果为准每日提醒当前只保存偏好不能描述成已调度通知模块描述和存储名中的旧产品残留要处理任何新增权限都要同时补齐用途、拒绝、降级、隐私材料和测试。权限合规不是把requestPermissions写得越短越好而是让每一项声明都能在源码中找到唯一用途让每一条用户说明都能被配置和运行结果证明。代码、权限、页面与上架材料说同一件事才是可复核的 HarmonyOS 隐私工程。本文部分内容由 AI 辅助整理。现有权限、TTS、本地存储、设置与清理行为均依据上述源码复核关于持久化结果返回、权限状态模型、自动扫描和材料改写的内容属于基于当前实现边界的工程增强建议。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价