结论:必须解决manifest.json权限声明、androidPrivacy.json弹窗模式、签名证书有效期和工信部备案四件事。权限需按实际调用精简并注明用途;androidPrivacy.json须设"prompt":"template"且首次启动即弹;证书有效期≥25年;备案主体为企业且三者信息一致;动态权限须在用户操作时分步申请。

直接说结论:不解决 manifest.json 权限声明、androidPrivacy.json 弹窗模式、签名证书有效期和工信部备案这四件事,其他优化都是白忙。
manifest.json 里权限声明必须“用多少写多少”
华为/小米/OPPO 的自动化扫描工具会比对 AndroidManifest.xml 和实际 JS 调用——哪怕你只在 uni.getLocation 前加了一行注释,但没真调用,勾选了 ACCESS_FINE_LOCATION 就算“过度索取”。
- 删掉所有没用到的权限,比如
READ_SMS、GET_TASKS、WRITE_CONTACTS -
READ_EXTERNAL_STORAGE在 Android 11+ 已被限制,若仅读取 App 自有目录,可直接去掉 - 敏感权限(如定位、相机)必须配套在隐私政策中说明用途,不能只写“用于功能需要”
- 检查
uni-app插件是否悄悄引入权限:比如某些地图插件会自动声明ACCESS_COARSE_LOCATION,得进插件源码或node_modules里搜uses-permission
androidPrivacy.json 必须用 template 模式且首次启动就弹
应用市场不是看你有没有弹窗,而是看弹窗是否在系统级最早时机触发。自己用 uni.showModal 实现的弹窗,或延迟到 onLaunch 后几秒再弹,全都会被判定为“未在收集前获得同意”。
-
androidPrivacy.json中"prompt": "template"是硬性要求,"message"字段可为空,但不能删 - 弹窗文案标题必须与你在商店后台填写的《隐私政策》文件名一致(比如后台填的是“服务协议和隐私政策_v2026.pdf”,弹窗
title就不能简写成“隐私协议”) - DCloud 运行时本身会采集基础设备信息(如屏幕尺寸、UA),所以你的隐私政策里必须包含 DCloud 官方要求的那段声明,漏掉一句都会被驳回
- 调试基座(custom debug basis)下不触发该弹窗,务必用云打包或离线打包后真机验证
签名证书和工信部备案是上传前的硬门槛
不是“审核不通过”,而是根本点不了上传按钮。2026 年起,华为/小米/OPPO 后台已强制校验这两项。
- 证书必须是自签、有效期 ≥25 年:
keytool -genkey -alias mykey -keyalg RSA -validity 9125 -keystore mykey.keystore - 上传前需在商店后台填写 SHA-256 指纹,命令是:
keytool -list -v -sha256 -keystore mykey.keystore -alias mykey - 工信部备案主体必须是企业,且营业执照名称、ICP 备案域名、银行对公账户三者完全一致;包名和证书指纹必须与备案系统里提交的一致
- 备案号格式为
京ICP备XXXXXXXX号,需填入 manifest.json 的"android": { "icp": "京ICP备XXXXXXXX号" }字段
动态权限申请必须“用户点按钮才触发”,不能 onLaunch 就调
人工复审员会装上 App 后逐个点击功能入口。如果你在 onLaunch 里调 uni.authorize,或者用户拒绝后没做判断就反复弹,会被直接打回。
- 把权限检查逻辑下沉到具体操作:比如“获取当前位置”按钮的
click回调里,先uni.getSetting,再根据authSetting['scope.userLocation']决定是否uni.authorize - 拒绝后不要重试,改用引导文案:“请前往设置 > 应用 > 权限中开启位置访问”
- 涉及多个权限(如拍照+定位),不要一次性申请,按功能链路分步走:先拍完照再问是否同步位置
- 注意
uni.openSetting在部分安卓 12+ 设备上可能跳转失败,建议 fallback 到系统设置页 Intent(需原生插件支持)
最常被忽略的其实是时间差问题:工信部备案平均要 1–3 个工作日,证书生成后 SHA-256 指纹要手动填进三个地方(manifest.json、各商店后台、备案系统),任一错位都会导致“备案通过但上架失败”。建议把这三处指纹值存在同一个文本文件里,每次更新都统一替换。











