uni-app 隐私协议弹窗需在 manifest.json 或 androidPrivacy.json 中完整配置 privacy 节点,prompt 为 "template",buttonRefuse 为“不同意并退出App”,链接须 HTTPS 可访问;androidPrivacy.json 优先级更高、支持热更新;用户拒绝后必须调用 plus.runtime.quit() 真退出;权限申请和 SDK 初始化必须滞后于隐私同意。
manifest.json 的 privacy 配置必须存在且完整
uni-app 不会自动弹出隐私协议弹窗,除非你在 manifest.json 里显式声明了 privacy 节点。很多开发者以为加个链接或写个页面就合规了,其实系统级弹窗必须由这个配置触发——它才是审核时被扫描的第一道关卡。
-
prompt必须设为"template",其他值(如"none"或空)会导致弹窗完全不出现 -
buttonRefuse文本必须是"不同意并退出App",华为/小米等商店会校验字面匹配,写成“取消”“拒绝”都会被拒 -
message中的隐私政策链接必须可访问、HTTPS、页面能正常加载,否则用户点击后白屏,也算违规 - 该配置只对 App 平台生效(
app-plus),H5 和小程序不受影响,别误配到mp-weixin下
androidPrivacy.json 比 manifest.json 更可靠,尤其在真机调试阶段
HBuilderX 3.2.1+ 默认优先读取项目根目录下的 androidPrivacy.json,它比 manifest.json 里的 privacy 配置更早生效、支持热更新、真机预览即见效果。如果你改了 manifest.json 却没弹窗,大概率是因为这个文件已存在且覆盖了配置。
- 文件路径必须是项目根目录,不是
static或unpackage下 - 内容结构和
manifest.json内的privacy几乎一致,但多一个必填字段:version: "1" - 如果同时存在两个配置,以
androidPrivacy.json为准;删掉它,manifest.json才会重新接管 - 模拟器可能不触发该弹窗,务必用真机测试——部分 Android 厂商 ROM 对首次启动弹窗有定制逻辑
用户点“不同意”后必须真正退出,不能只是跳转首页
点“不同意并退出App”不是 UI 跳转,而是调用原生退出流程。常见错误是监听到拒绝回调后 uni.navigateTo 到空白页,这等于欺骗审核,也会被用户投诉“点了退出却还在运行”。
- 在
manifest.json中配置后,uni-app 会自动处理退出逻辑,你无需写代码 - 但如果你手动监听了
plus.runtime.getProperty('privacyAgreed')并自行判断,就必须调用plus.runtime.quit(),而不是uni.navigateBack或uni.reLaunch - iOS 上
plus.runtime.quit()实际是退到后台,符合苹果规范;Android 上才是彻底杀进程 - 不要在退出前加延时、动画或埋点上报,部分厂商系统会拦截非即时退出行为
权限申请必须滞后于隐私协议同意,且不能自动触发
哪怕你只申请 ACCESS_FINE_LOCATION,只要在用户点“同意”前就调用了 uni.getSystemInfo 或初始化 SDK,就可能提前采集设备信息,直接构成违规。隐私协议是所有数据采集和权限申请的“闸门”。
- 所有
uni.authorize、uni.openSetting、uni.chooseImage等涉及权限的 API,必须包裹在用户已同意隐私协议的判断之后 - 推荐用全局状态管理(如 Pinia 的
isPrivacyAgreed)控制权限相关逻辑,而不是每次调用前查plus.runtime.getProperty - 登录页、首页 onLoad 钩子中禁止主动调用任何可能触发权限的 API,哪怕只是
uni.getProvider查微信登录支持情况 - 第三方 SDK(如友盟、极光)必须配置为“延迟初始化”,等
isPrivacyAgreed === true后再调用其 init 方法
实际开发中最容易被忽略的,是「隐私协议弹窗和权限申请之间没有建立强依赖关系」——配置写了,弹窗也出了,但业务代码照常跑,SDK 照常采数。这种“形合神不合”的状态,审核时一眼就能被识别出来。










