uni.getprivacysetting用于判断是否需弹窗,仅当needauthorization为true时才必须弹窗;需在onlaunch或onload调用,配合uni.setstoragesync持久化用户同意状态,并确保多页面共享及低基础库版本兜底。

uni-app中如何用uni.getPrivacySetting判断是否需要弹窗
微信小程序从基础库 3.0.0 开始提供 uni.getPrivacySetting,它不是“用户有没有同意”,而是“当前是否处于需主动授权的合规拦截状态”。返回值里关键字段是 needAuthorization ——只有它为 true 时,才必须弹出自定义弹窗;否则直接走原有逻辑即可。
常见错误是把它当 uni.getSetting 用,误以为能查到用户历史选择。实际上它只反映当前环境是否触发了平台级隐私检查机制(比如 app.json 中配置了 "usePrivacyCheck": true 且基础库达标)。
- 必须在
onLaunch或页面onLoad里调用,不能延迟到按钮点击时才查 - 失败回调里不要 fallback 到默认同意,
fail通常意味着基础库太低或配置缺失,应记录日志而非静默处理 - 返回的
privacyContractName可直接用于弹窗标题,避免硬编码
勾选状态怎么存、怎么读才不会丢
用户点“同意”后,状态必须持久化,且后续每次进入都要重新校验。最稳妥方式是用 uni.setStorageSync 存布尔值,而不是存在 data 或 vuex 里——前者重启即丢,后者跨页面不共享。
示例:用户点击同意按钮后执行
uni.setStorageSync('hasAgreedPrivacy', true)
下次进入页面时,先读再决定是否跳过弹窗:
const hasAgreed = uni.getStorageSync('hasAgreedPrivacy') === true
if (hasAgreed) {
// 直接进行后续操作,比如调用 uni.getLocation
} else {
// 显示弹窗
}
- 别用
uni.setStorage(异步),它可能在页面跳转前没写入完成 - 别把状态存在
this.agreeStatus这类临时变量里,页面刷新就没了 - 如果小程序有多个入口页(如分享链接进来的页面),每个页面的
onLoad都得做这个判断
为什么checkbox必须用checkbox-group包裹
uni-app 的 checkbox 组件在微信小程序端有个硬性要求:单个 checkbox 必须被 checkbox-group 包裹,否则 bindchange 不触发,iOS 下样式错乱,甚至影响表单提交行为。
即使你只用一个勾选框,也得这么写:
<checkbox-group><label>
<checkbox :value="true"></checkbox>
我已阅读并同意《隐私政策》
</label>
</checkbox-group>
-
@change回调接收的是字符串数组,比如["true"],所以判断逻辑要写成event.detail.value.length > 0 - 别用
v-model绑定布尔值,uni-app 的 checkbox 不支持双向绑定 - 勾选框的
value推荐用字符串"agree",比"true"更语义化,也方便后续扩展多协议选项
登录按钮被点击时如何阻断未同意流程
核心不是禁用按钮,而是拦截点击后的业务逻辑。很多开发者只加了个 :disabled="!agree",但用户仍可能绕过 UI 点击(比如键盘回车、自动脚本),所以校验必须落在事件处理函数里。
正确做法是:
login() {
if (!this.agree) {
uni.showToast({ title: '请先阅读并同意隐私政策', icon: 'none' })
return
}
// 此处才发起登录请求
}
- 不要依赖 UI 层的 disabled 做唯一防线,它只是辅助体验
- 提示文案要明确指向“隐私政策”,不能只说“请先同意”——审核时会被认为告知不清
- 如果登录接口本身会触发
uni.getLocation等隐私接口,记得在调用前再 check 一次,因为用户可能在弹窗后手动关闭了授权











