上架审核常见驳回与隐私合规清单:过审前先自查这 8 条【鸿蒙心迹】

摘要

本文基于 HarmonyOS 应用上架审核的真实经历,复盘了首次提审被驳回三次的完整过程:隐私声明未写清相机权限用途、申请了用不到的位置权限、截图与真机界面不一致。围绕「隐私合规 + 权限最小化」这一审核核心,文章给出可直接照抄的 module.json5 权限声明范式、隐私政策文案结构、8 条常见驳回对策、一张判定流程图和一份提审前自查清单,帮助开发者把「声明的 = 做的」落到实处,尽量一次过审。

目录

一、背景与痛点

功能写完只是第一步,能不能上架才是终点。我第一个应用被驳回了三次:第一次是隐私声明里没写清楚相机权限的用途,第二次是申请了用不到的位置权限,第三次是截图与实机界面不一致。每一次驳回都要等上好几天。

鸿蒙应用市场(含元服务)的审核越来越看重隐私合规与权限最小化。本文把最常见的驳回点和一份可直接照抄的自查清单整理出来,帮你一次过审。

二、三次驳回的完整复盘

三次驳回不是三件孤立的事,而是一条从"没写清楚"到"多申请"再到"素材不实"的递进线。把每次的时间、原因、整改动作和复审耗时摊开看,规律就很清楚了:

次数 驳回时间 驳回原因 整改动作 复审耗时
第一次 首次提审后第 2 天 隐私声明未说明相机权限的具体用途,仅写"用于相关功能" 在隐私政策中补写"用于扫码识别二维码、拍摄头像",并在 module.json5 的 reason 中同步该表述 约 3 个工作日
第二次 第一次复审通过后第 1 天 申请了 ohos.permission.APPROXIMATELY_LOCATION,但功能中并无位置相关场景 删除该权限申请,同步删除隐私声明中的位置条目,确保声明与代码一致 约 2 个工作日
第三次 第二次复审通过后第 1 天 提交的截图与真机界面不一致,部分功能在截图中不可见 重新用真机截取全部核心页面,补充真实数据,替换全部素材 约 4 个工作日

从这三次里能提炼出四条可复用经验,正好对应后文 8 条清单中的前几条:

  • 声明要跟着代码走,而不是跟着想象走:第一次驳回的根因是"写了但没写清",整改时以代码实际申请为准回填声明,对应清单第 1 条。
  • 权限只留业务真正用到的:第二次驳回是典型的过度申请,删掉用不到的权限比解释它更省事,对应清单第 2 条。
  • reason 要写场景,不写形容词:"用于相关功能"这类表述等于没写,改成具体动作才能过,对应清单第 3 条。
  • 素材必须来自真机:第三次驳回说明审核方会拿截图和实机比对,设计稿再精美也没用,对应清单第 5 条。

三次驳回累计多花了约 9 个工作日,而这些问题在提审前用一张自查表就能全部拦下------这也是后文整理 8 条清单和自查清单的直接原因。

二、审核关注维度

维度 审核重点
隐私 隐私声明是否完整、与实际收集行为一致
权限 是否过度申请、每个权限是否有明确用途说明
内容 是否含违规、侵权、虚假宣传
包体 签名/包名是否与资质一致、是否存在调试残留
体验 截图/视频是否真实反映功能、有无明显缺陷

三、核心代码(权限声明 + 隐私配置)

json5 复制代码
// module.json5:权限必须带 reason(用途说明),且仅申请用到的
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.CAMERA",
        "reason": "$string:camera_reason",   // 必须能说清"为什么要用"
        "usedScene": { "abilities": ["EntryAbility"], "when": "inUse" }
      }
    ]
  }
}
json5 复制代码
// 隐私与自启动:避免申请无关的后台/关联启动能力
// 在 app.json5 / 隐私政策文案中明示:收集哪些信息、用于什么、是否上传

隐私政策文案可直接按下面的结构逐条填写,与代码实际申请保持一致:

  • 相机权限(ohos.permission.CAMERA)
    • 收集的信息类型:拍摄的照片、扫码时的图像画面
    • 用途:用于扫码识别二维码、拍摄头像或上传图片
    • 是否上传服务器:仅在用户主动提交时上传,本地不保留原始画面
    • 是否共享第三方:不共享
  • 位置权限(ohos.permission.APPROXIMATELY_LOCATION)
    • 收集的信息类型:粗略地理位置(城市级)
    • 用途:用于展示附近门店、按地区推荐内容
    • 是否上传服务器:是,仅上传脱敏后的城市信息
    • 是否共享第三方:不共享
  • 存储/文件权限(ohos.permission.READ_IMAGEVIDEO)
    • 收集的信息类型:用户主动选择的图片、视频文件
    • 用途:用于头像设置、内容发布
    • 是否上传服务器:仅在用户主动发布时上传
    • 是否共享第三方:不共享
  • 设备与日志信息
    • 收集的信息类型:设备型号、系统版本、崩溃日志
    • 用途:用于问题排查与稳定性优化
    • 是否上传服务器:是,匿名化后上传
    • 是否共享第三方:仅与提供崩溃分析服务的合作方共享,且已做去标识化处理
  • 账号信息
    • 收集的信息类型:手机号、昵称、头像
    • 用途:用于账号注册、登录与身份识别
    • 是否上传服务器:是
    • 是否共享第三方:不共享

提示:以上每一条都必须与 module.json5 中实际申请的权限一一对应,未申请的权限不要写进声明,声明里写到的权限也必须在代码中体现。

四、常见驳回与对策(8 条清单)

  1. 隐私声明缺失或不一致:声明里没列某项权限,代码却申请了。对策:以代码实际申请为准,逐条回填声明。
  2. 权限过度申请:申请了用不到的位置、通讯录权限。对策:只保留业务必需的权限,删除多余项。
  3. 权限 reason 表述模糊:写"提升体验"这类空话。对策:写具体场景,如"用于扫码识别二维码"。
  4. 签名、包名不符:测试包与提交包的签名不一致。对策:统一使用 Release 签名,并在 CI 中固化。
  5. 截图与实机不一致:用设计稿冒充实机截图。对策:直接截取真机运行图,包含真实数据。
  6. 存在调试残留:日志泄露、测试账号未清理、未接入支付却写"支持购买"。对策:发版前清理日志、移除测试入口。
  7. 自启动、关联启动未说明:后台拉起能力没在声明里讲清楚。对策:非必要不开启,开启就写明场景。
  8. 内容违规:含侵权素材、夸大宣传、诱导分享。对策:素材自查版权,宣传用语留有余地。

五、驳回自查流程图

把 8 条清单串成一条判定链,提审前按顺序走一遍,任何一环不通过就先整改再往下走,避免带着问题提交后被整体驳回:
#mermaid-svg-b54XDs2zqiVZxcjr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-b54XDs2zqiVZxcjr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-b54XDs2zqiVZxcjr .error-icon{fill:#552222;}#mermaid-svg-b54XDs2zqiVZxcjr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-b54XDs2zqiVZxcjr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-b54XDs2zqiVZxcjr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-b54XDs2zqiVZxcjr .marker.cross{stroke:#333333;}#mermaid-svg-b54XDs2zqiVZxcjr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-b54XDs2zqiVZxcjr p{margin:0;}#mermaid-svg-b54XDs2zqiVZxcjr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-b54XDs2zqiVZxcjr .cluster-label text{fill:#333;}#mermaid-svg-b54XDs2zqiVZxcjr .cluster-label span{color:#333;}#mermaid-svg-b54XDs2zqiVZxcjr .cluster-label span p{background-color:transparent;}#mermaid-svg-b54XDs2zqiVZxcjr .label text,#mermaid-svg-b54XDs2zqiVZxcjr span{fill:#333;color:#333;}#mermaid-svg-b54XDs2zqiVZxcjr .node rect,#mermaid-svg-b54XDs2zqiVZxcjr .node circle,#mermaid-svg-b54XDs2zqiVZxcjr .node ellipse,#mermaid-svg-b54XDs2zqiVZxcjr .node polygon,#mermaid-svg-b54XDs2zqiVZxcjr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-b54XDs2zqiVZxcjr .rough-node .label text,#mermaid-svg-b54XDs2zqiVZxcjr .node .label text,#mermaid-svg-b54XDs2zqiVZxcjr .image-shape .label,#mermaid-svg-b54XDs2zqiVZxcjr .icon-shape .label{text-anchor:middle;}#mermaid-svg-b54XDs2zqiVZxcjr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-b54XDs2zqiVZxcjr .rough-node .label,#mermaid-svg-b54XDs2zqiVZxcjr .node .label,#mermaid-svg-b54XDs2zqiVZxcjr .image-shape .label,#mermaid-svg-b54XDs2zqiVZxcjr .icon-shape .label{text-align:center;}#mermaid-svg-b54XDs2zqiVZxcjr .node.clickable{cursor:pointer;}#mermaid-svg-b54XDs2zqiVZxcjr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-b54XDs2zqiVZxcjr .arrowheadPath{fill:#333333;}#mermaid-svg-b54XDs2zqiVZxcjr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-b54XDs2zqiVZxcjr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-b54XDs2zqiVZxcjr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-b54XDs2zqiVZxcjr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-b54XDs2zqiVZxcjr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-b54XDs2zqiVZxcjr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-b54XDs2zqiVZxcjr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-b54XDs2zqiVZxcjr .cluster text{fill:#333;}#mermaid-svg-b54XDs2zqiVZxcjr .cluster span{color:#333;}#mermaid-svg-b54XDs2zqiVZxcjr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-b54XDs2zqiVZxcjr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-b54XDs2zqiVZxcjr rect.text{fill:none;stroke-width:0;}#mermaid-svg-b54XDs2zqiVZxcjr .icon-shape,#mermaid-svg-b54XDs2zqiVZxcjr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-b54XDs2zqiVZxcjr .icon-shape p,#mermaid-svg-b54XDs2zqiVZxcjr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-b54XDs2zqiVZxcjr .icon-shape .label rect,#mermaid-svg-b54XDs2zqiVZxcjr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-b54XDs2zqiVZxcjr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-b54XDs2zqiVZxcjr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-b54XDs2zqiVZxcjr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不通过
通过
不通过
通过
不通过
通过
不通过
通过
不通过
通过
不通过
通过
不通过
通过
提审前自查
隐私声明一致性检查
以代码实际申请为准逐条回填声明,删除多写项
权限最小化检查
删除业务用不到的权限,同步清理声明条目
reason 表述检查
改写为具体场景,如用于扫码识别二维码
签名包名检查
统一 Release 签名,核对 bundleName 与资质一致
真机截图检查
重新用真机截取核心页面,替换设计稿素材
调试残留检查
清理日志、移除测试入口与测试账号
内容合规检查
替换侵权素材,收敛夸大宣传与诱导分享用语
提交审核

图中每个判定节点都对应上文 8 条清单中的一条,整改动作即清单里的「对策」;只有全部判定通过,才进入「提交审核」这一步。

五、提审前自查清单

检查项 对应代码/配置位置 是否通过 备注
隐私声明一致性 隐私政策文案 ↔ module.json5 的 requestPermissions ☐ 声明与代码逐条对齐,无多写、无漏写
权限最小化 module.json5 的 requestPermissions 列表 ☐ 只保留业务必需权限,删除位置、通讯录等冗余项
reason 表述 module.json5 中每个权限的 reason 字段及 resources/base/element/string.json ☐ 写具体场景,避免"提升体验"这类空话
签名包名 build-profile.json5 的签名配置、app.json5 的 bundleName ☐ 提交包与资质一致,统一使用 Release 签名
真机截图 应用市场素材(截图/视频) ☐ 真机运行截图,含真实数据,不用设计稿
调试残留 日志输出、测试账号、隐藏入口 ☐ 发版前清理日志、移除测试入口与测试账号
自启动说明 module.json5 的 abilities、后台任务配置 ☐ 非必要不开启,开启则在声明中写明场景
内容合规 文案、图片、音视频素材 ☐ 素材版权自查,宣传用语留有余地

使用说明:提审前把这张表逐行过一遍,每项确认无误后在"是否通过"栏打钩;只要有一项没打钩就先别提交,等整改完再走审核流程,能省下大量驳回等待时间。

六、总结

过审的本质是**"你声明的 = 你做的"**:权限最小化、隐私讲清楚、包体干净、素材合规。建议提审前用上面 8 条逐条打钩,能省下大量驳回等待时间。落地记住:权限只申请用到的、声明与代码一致、截图用真机、发版清残留。

三次驳回累计多花的约 9 个工作日,本质上都是「声明与实现脱节」的代价。把本文的复盘表、8 条清单、判定流程图和自查清单串起来用,提审前花半小时自查,往往能省下几天甚至一周的复审等待。

本文为原创首发实战笔记,基于 HarmonyOS 应用上架审核与隐私合规实践,代码示例为配置范式示意,实际规范以华为应用市场官方文档为准。

相关推荐
missile1111 小时前
# HDR 算法 ISP 通路客制化方案(G100 / mt6789)
java·前端·javascript
贾伟康2 小时前
【共创稿事节】布局审查工具与边界调试
harmonyos·arkui·inspector·性能排查·布局调试
SEO_juper2 小时前
Bash 交叉验证 robots.txt 和 sitemap:两个文件自相矛盾,页面永远收录不了
开发语言·python·node.js·json·bash
2501_946244782 小时前
开源鸿蒙平台 CMP 三方库「compose-collapsing-toolbar」适配全流程
华为·开源·harmonyos
geovindu2 小时前
rust: Read-Write Lock Pattern
开发语言·后端·设计模式·rust·读写锁模式·同步型模式
怪我冷i2 小时前
Rust智能指针Rc<T> 使用总结
开发语言·后端·rust
全栈陈序员2 小时前
【Python】基础语法入门(三十)—— Web 开发入门:用 Flask 搭建第一个网站
前端·python·flask
全栈陈序员2 小时前
【Python】基础语法入门(三十三)—— 日志系统详解:用 logging 记录程序运行
java·开发语言·python