只改manifest.json的privacy字段无效,必须勾选HBuilderX中“使用原生隐私政策提示框”开关并生成androidPrivacy.json才生效。

manifest.json 里配 privacy 就能弹窗?别信
不能。只改 manifest.json 中的 privacy 字段,**在真机运行、调试基座里完全看不到效果**——这是最常被卡住的第一步。它只在云打包或本地打包生成的正式安装包中生效,且必须配合 HBuilderX 的“使用原生隐私政策提示框”开关(会自动生成 androidPrivacy.json)。很多人反复改 manifest.json 却没勾选图形界面里的复选框,结果白调两天。
- 务必打开 HBuilderX → manifest.json → “App启动界面配置” → 勾选
使用原生隐私政策提示框 - 勾选后自动生成的
androidPrivacy.json才是真正起作用的配置文件,manifest.json里的privacy只作兼容性声明 - 华为商店强制要求
buttonRefuse文本必须为不同意并退出App,写成暂不同意或稍后再说会被拒审
androidPrivacy.json 配置项怎么填才不翻车
androidPrivacy.json 是安卓端隐私弹窗的唯一控制文件,字段名看着简单,但几个关键点错一个就失效:
-
prompt必须是"template"(字符串,不是布尔值),填template或true都会报错 -
message里必须包含可点击的隐私政策链接,格式为[隐私政策](https://yourdomain.com/privacy);纯文字无链接 = 不合规 -
title和message不能含 HTML 标签,也不能用 \n 换行——安卓原生 Dialog 不解析这些,会显示为乱码或截断 - 如果用了自定义原生插件(比如修改弹窗颜色),必须确保插件已正确注册到
nativePlugins目录,且androidPrivacy.json中未与插件配置冲突
用户点了“不同意”,App 真的退出了吗?
很多开发者以为只要配了 buttonRefuse,系统就会自动退出——其实不会。DCloud 运行时只负责弹窗,**“退出”行为需要你手动触发**,否则用户点了“不同意并退出App”,App 仍在后台跑,直接被各大商店判定为欺诈性弹窗。
- 必须在
App.vue的onLaunch生命周期里监听uni.onPrivacyAuthorization回调 - 当回调返回
{ authorized: false }时,立刻执行uni.exitMiniProgram()(小程序)或plus.runtime.quit()(App) - 注意:iOS 上
plus.runtime.quit()无效,需用plus.ios.invoke(plus.ios.mainApplication(), 'terminateWithSuccess'),否则苹果审核必挂
为什么自己写的 Vue 弹窗组件永远过不了审
因为应用商店要的是「首次启动即阻断」——在任何 JS 逻辑执行前、任何 SDK 初始化前,就必须弹出。你自己写的 Vue 组件属于 Webview 层,等它渲染出来时,DCloud 底层统计 SDK、Weex 引擎、甚至 Fresco 图片库可能已经上报了设备信息,这叫“先收集、后授权”,是合规红线。
- 原生弹窗(
androidPrivacy.json+ 开关)由 DCloud 运行时在 Native 层最早期触发,确保零 JS 干预 - 自定义 Vue 弹窗只能作为二次确认(比如用户同意后,再申请定位权限时用),绝不能替代首次隐私弹窗
- 如果你硬要用 Vue 实现,必须配合
uni.getSystemInfoSync().platform === 'app-plus'+plus.storage.getItem判断是否首次启动,并在App.vue的onLaunch里同步阻塞,但依然无法规避 SDK 提前初始化的风险
最容易被忽略的点是:DCloud 官方运行时本身就会采集基础设备信息(如 UA、屏幕尺寸),这部分必须在你的隐私政策文本中明确说明,并引用 DCloud 的标准条款。漏掉这一句,哪怕弹窗再漂亮,也会被退回。

















