微信小程序隐私授权必须严格遵循原生链路:uni.getPrivacySetting探针、wx.onNeedPrivacyAuthorization监听、open-type="agreePrivacyAuthorization"按钮三者缺一不可,且manifest.json中mp-weixin节点需配置"__usePrivacyCheck__": true,基础库≥3.0.0,仅onLaunch调用getPrivacySetting,监听器需全局防覆盖,按钮须原生并精准触发resolve({event:'agree'})。

微信小程序端的隐私弹窗不是加个 Vue 组件就能过审的,必须走微信原生隐私授权链路——uni.getPrivacySetting 探针 + wx.onNeedPrivacyAuthorization 监听 + open-type="agreePrivacyAuthorization" 按钮三者缺一不可,漏掉任一环节都会导致真机不弹、点击无响应或审核驳回。
manifest.json 必须显式开启隐私检查
只改 mp-weixin 节点下的 "__usePrivacyCheck__": true 才生效,双下划线不能少、大小写不能错。这个字段是微信底层触发 onNeedPrivacyAuthorization 的开关,没它,后续所有逻辑都白搭。
- 检查编译后
dist/mp-weixin/app.json是否真实存在该字段(别只信 manifest 编辑器) - 基础库版本必须 ≥ 3.0.0,开发者工具右上角「详情 → 项目设置」里确认
- 低版本微信不支持该字段,必须用
if (wx.getPrivacySetting)包裹调用,否则安卓低端机静默白屏
onLaunch 中调用 getPrivacySetting 是唯一安全时机
不能在页面 onLoad、组件 mounted 或任何 SDK 初始化之后调用——微信会在你调用 uni.getSystemInfo 这类隐式读取设备信息的 API 时提前拦截,导致还没弹窗就已失败。
- 只在
App.vue的onLaunch里第一时间执行uni.getPrivacySetting - 仅当
res.needAuthorization === true时才设showPrivacy = true,false 不代表用户拒绝,可能是已授权或基础库不支持 - 回调里禁止跳转页面、禁止调用业务 API,它只是探测,不是授权动作本身
onNeedPrivacyAuthorization 监听器必须全局注册且防覆盖
这个监听器不是事件总线,它绑定的是当前 JS 执行上下文。页面切换后,旧监听器自动失效,新页面不重注册就会收不到回调。
- 必须在
App.vue的onLaunch和onShow中都注册,确保冷启和热启都覆盖 - 每次注册前要清空上一次的
resolve引用,避免多个页面共用一个resolve导致回调错乱 - 监听器内不能直接改 Vue 响应式数据(如
this.showPopup = true),要用uni.$emit或 Pinia store 触发跨组件通信 - 如果同时要调定位 + 读相册,微信只触发一次回调,必须等用户点“同意”后统一
resolve({ event: 'agree' }),不能分次 resolve
agreePrivacyAuthorization 按钮必须原生、位置受限、参数精准
自定义弹窗里的“同意”按钮不是普通 @click,它是微信原生能力入口,样式、位置、文案、调用方式全有硬性限制。
- 按钮必须带
open-type="agreePrivacyAuthorization",且绑定事件为@agreeprivacyauthorization(全小写、无横线) - 只能出现在主视图弹窗内,不能放在 tabbar、下拉刷新、悬浮窗或 WebView 里
- 文案必须含“同意”“授权”等明确动词,禁用“知道了”“继续使用”
-
@agreeprivacyauthorization回调里只做一件事:调用resolve({ event: 'agree' }),不能加延时、不能 await、不能触发业务逻辑 - resolve 参数必须是对象,
{ event: 'agree' }或{ event: 'disagree' },传字符串会挂起 API
最容易被忽略的是:微信的隐私授权流程是「阻断式」的,resolve 不调,uni.getLocation 就永远卡住,控制台还不报错。很多开发者以为弹窗出来了就万事大吉,其实真正的授权动作藏在那一行 resolve 里,而且它必须在正确的上下文、正确的时机、用正确的格式执行。











