小程序和App隐私弹窗机制完全独立,必须分端配置:微信小程序需manifest.json中mp-weixin节点设"__usePrivacyCheck__": true、onLaunch调用uni.getPrivacySetting并注册wx.onNeedPrivacyAuthorization;Android App须在HBuilderX勾选原生提示框生成androidPrivacy.json,且prompt为"template"、message含可点击链接,拒绝后需手动plus.runtime.quit()。

小程序和 App 的隐私弹窗是两套完全独立的机制,不能混用配置,也不能指望一个配置打遍所有端。你改了 manifest.json 里的 app-plus.privacy,微信小程序里绝不会弹;你在 mp-weixin 节点加了 "__usePrivacyCheck__": true,Android 打包时也完全不认。必须按端拆开处理。
微信小程序端:必须走原生三件套 + 基础库兜底
微信强制要求从基础库 3.0.0 起启用隐私探针,且只响应原生事件链路。
-
manifest.json的mp-weixin节点下必须写"__usePrivacyCheck__": true(双下划线、大小写敏感,写成usePrivacyCheck或__useprivacycheck__都无效) - 编译后检查
dist/mp-weixin/app.json是否真实存在该字段——很多开发者只改 manifest 编辑器,没触发重新编译,导致真机无反应 -
App.vue的onLaunch中第一时间调用uni.getPrivacySetting,仅当res.needAuthorization === true时才准备弹窗逻辑;false不代表拒绝,可能是已授权或基础库不支持 -
wx.onNeedPrivacyAuthorization必须在onLaunch和onShow中都注册,每次注册前清空上一次的resolve引用(例如用window.__privacyResolve = null),否则热启时回调错乱 - 用户点击“同意”按钮时,必须在同步点击上下文中调用
resolve({ event: 'agree' })——不能包在uni.showModal回调里,也不能加setTimeout
Android App 端:template 模式是唯一过审路径
自己写的 Vue 弹窗组件、nvue 页面弹窗、甚至用插件自定义 UI,只要不是系统级阻断式弹窗,华为/小米/OPPO 等主流商店一律拒审。
- 必须在 HBuilderX 的
manifest.json可视化界面中勾选「使用原生隐私政策提示框」,否则androidPrivacy.json不会生成,配置全白搭 -
androidPrivacy.json中"prompt": "template"是字符串,不是布尔值,填true或"true"都会导致弹窗不出现 -
message字段必须含可点击链接,格式为[隐私政策](https://xxx.com/privacy);纯文本、HTML 标签、\n换行都会被截断或显示异常 - 用户点「不同意并退出App」后,DCloud 运行时不自动退出——你必须监听
uni.onPrivacyAuthorization,收到{ authorized: false }后手动执行plus.runtime.quit()(iOS 需用plus.ios.invoke)
常见踩坑点:时机、作用域、字段名三重陷阱
最常失效的不是逻辑,而是配置落地的细节。
- 小程序端在页面
onLoad里调uni.getPrivacySetting→ 微信已在内部读取设备信息,直接拦截,弹窗永不触发 - App 端只改
manifest.json的app-plus.privacy,没勾 HBuilderX 复选框 →androidPrivacy.json不存在,真机调试基座里完全看不到弹窗 -
androidPrivacy.json里buttonRefuse写成「暂不同意」→ 华为商店明确要求必须是「不同意并退出App」,否则驳回 - 小程序监听器注册在某个页面而非
App.vue→ 页面切换后监听丢失,冷启能弹、热启必静默
真正难的不是写代码,是让配置文件生成、编译输出、运行时环境、微信/安卓系统四者对齐。漏掉任意一环,弹窗就变成“薛定谔的弹窗”——你永远不确定它会不会在审核员手机上出现。











