最近发现微信小程序某些接口或组件需要先让用户授权同意隐私协议才可调用,下面我将我的使用经验分享给大家!
首先这个隐私协议对应的是小程序后台的用户隐私保护指引,如下:
里面阐述了你的小程序涉及了用户哪些隐私信息,例如手机号、头像、昵称等,如果后续小程序新增的功能涉及了协议之外的隐私信息,那么请一定要及时更新隐私协议内容,否则相关接口将不可调用
下面说说与隐私协议相关的接口和组件
// 1.获取隐私协议授权设置,可判断是否已经授权
wx.getPrivacySetting({
success: res => {
// 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' }
console.log(res)
// 需要进行隐私授权
if (res.needAuthorization) {
} else {
// 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用隐私接口
}
},
fail: () => {},
complete: () => {}
})
// 2.打开展示隐私协议内容的小程序默认页面
wx.openPrivacyContract({
success: () => {}, // 打开成功
fail: () => {}, // 打开失败
complete: () => {}
})
// 3.请求授权隐私协议,打开小程序默认的授权弹窗
wx.requirePrivacyAuthorize({
// 用户同意授权
success: () => {},
// 用户拒绝授权
fail: () => {},
complete: () => {}
})
// 储存授权中的等待状态
let resolvePrivacyAuthorization = null
// 4.监听用户隐私授权,当用户触发需要授权的动作比如调用 `wx.requirePrivacyAuthorize` 或者 `wx.getUserProfile` 以及一些其他需要隐私授权的接口,都会执行此回调,并通过 `resolve` 决定授权失败还是成功
wx.onNeedPrivacyAuthorization((resolve, eventInfo) => {
console.log('触发本次事件的接口是:' + eventInfo.referrer)
// 需要用户同意隐私授权时
// 弹出开发者自定义的隐私授权弹窗
resolvePrivacyAuthorization = resolve
})
// 5.隐私弹窗同意按钮,用于触发隐私授权的同意逻辑,将隐私授权改为已授权状态
<button open-type="agreePrivacyAuthorization">
了解完相关API和组件后,那么就有几种方案来实现这个功能了
实现这个功能之前,你首先需要知道你是想使用自定义的隐私授权弹窗还是小程序的默认隐私授权弹窗
1. 自定义隐私授权弹窗
方案一 强制用户同意隐私授权
用户进入小程序显示弹窗,拒绝则退出用小程序,同意按钮换成 `<button open-type="agreePrivacyAuthorization">`
方案二 不强制用户同意隐私授权
进入小程序通过 `wx.getPrivacySetting` 判断是否已经授权,如果没有授权则注册 `wx.onNeedPrivacyAuthorization` 事件,在回调中执行弹窗显示的逻辑,并记录回调的第一个参数,这个参数是在用户点击弹窗的同意按钮后执行此函数从而实现成功授权,注意这里注册 `wx.onNeedPrivacyAuthorization` 事件的原因只有一个,就是你的小程序内部使用了一些需要先隐私授权的接口或组件时,在你还没授权时,他会自动执行 `wx.onNeedPrivacyAuthorization` 事件中定义的逻辑,此时授权状态为等待状态,wx.onNeedPrivacyAuthorization只会注册一次
2. 小程序的默认隐私授权弹窗
方案一 强制用户同意隐私授权
进入小程序直接调用 `wx.requirePrivacyAuthorize` 函数,如果拒绝则退出小程序
方案二 不强制用户同意隐私授权
无需做特别的处理,如果你想主动调起默认弹窗只需调用 `wx.requirePrivacyAuthorize` 即可,如果是需要隐私授权的接口或者组件时会自动弹起默认弹窗,这里
`<input type="nickname" />`是一个例外,下面将会讲解如何解决这个问题
由于 input 的特殊原因他并不会自动弹默认弹窗,但是我们可以在它显示之前获取隐私授权的状态如果未授权直接禁用输入框,然后触摸时手动调用 `wx.requirePrivacyAuthorize`显示默认弹窗,成功授权后再解除禁用
以下UniApp的版本实现,大致实现思路都是一样的
<script setup lang="ts">
/** REF: 是否禁用 */
const disabled = ref(false)
// LIFECYCLE: 页面加载完成
onLoad(() => {
// 获取隐私协议设置
wx.getPrivacySetting({
success: res => {
// 当需要隐私协议授权时,先禁用输入框
disabled.value = res.needAuthorization
}
})
})
// EVENT: 请求隐私协议授权
const requirePrivacyAuthorize = () => {
// 当输入框被禁用,即代表需要请求隐私协议授权
if (disabled.value) {
// 请求隐私协议授权
wx.requirePrivacyAuthorize({
// 同意隐私协议
success: () => {
// 取消禁用输入框
disabled.value = false
}
})
}
}
</script>
<template>
<input
type="nickname"
:disabled="disabled"
@touchstart="requirePrivacyAuthorize"
/>
</template>
遇到的一些其他问题以及解决办法
我发现在某些需要用户授权的接口或组件会虽然自动拉起隐私弹窗,但是当你拒绝之后,想再次自动拉起隐私弹窗必须要等待10秒钟,官方的说法是为了防止频繁打扰用户,可我认为有时候就是不小心点到了拒绝,这个时候体验是很差的,因此直接在这之前手动调用`wx.requirePrivacyAuthorize`函数,这样每次都会弹出默认弹窗了
关于其他的一些相关疑问还请参考微信小程序官方文档,希望能够给你带来帮助!