2024年4月26日 更新:
基础库 3.4.2 更新 API 有授权弹窗的隐私接口(例如 wx.getLocation),将不会再弹官方隐私弹窗,而是在授权弹窗上增加“隐私勾选”;无授权弹窗的隐私接口(如 wx.getClipboardData),将继续保留原来的官方隐私弹窗
2023年12月25日 更新:
未授权时,input type="nickname" 会自动降级为 input type="text"
且 input 无法拉起官方隐私授权弹窗,需要按开发步骤 4、5 自行处理
2023年10月19日 更新:
已经过了官方公告的 10 月 17 日了,线上依然未生效。除非在 app.json 中手动配置 "__usePrivacyCheck__": true 来开启。
目前的处理方式为,把报错信息转换为中文
if (message.match('privacy permission is not authorized'))
message = '授权失败,请同意《用户隐私保护指引》'
2023年9月14日 更新:
可以不开发,直接使用系统弹窗,见图 3 。生效日期延长到 10 月 17日了。
《墨问便签》目前已回退了版本。
https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html#六、官方隐私弹窗功能说明
官方公告里目前的机制,目前还没生效上线,但看起来有 2 个坑:
1. 必须 wx.onNeedPrivacyAuthorization 上报,才能弹自定义弹窗。
意味着方案 1,如果用户取消授权了,是没有上报的,只能选择执行退出小程序。
否则调用隐私接口时,系统弹窗会出现。
2. 用户取消授权后,间隔 10s,才能再次请求授权。
意味着 10s 内功能不可用,需要给用户一个提示语。而系统默认的报错不会 toast,以及报错信息是英语,用户也看不懂呀。
———————
总体思路:
目前有两个方案可供选择
1. 小程序启动时,弹出,拒绝后直接退出小程序(只用 wx.getPrivacySetting 即可)
2. 调用隐私接口前,弹出,同意后才调用隐私接口(不用 wx.getPrivacySetting,需要使用 wx.requirePrivacyAuthorize 和 wx.onNeedPrivacyAuthorization)
推荐方案 2,下面具体说说
事前准备:
1. 在文档中查看是否使用了相关隐私接口
https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html
2. 在「小程序管理后台」设置《小程序用户隐私保护指引》
见图 1,具体位置是:小程序后台 - 设置 - 基本设置 - 服务内容声明 - 用户隐私保护指引
3. 如果有用到隐私接口,则需要进行小程序开发。如果没有用到隐私接口,则无需开发
实际运行的流程为:
1. 发起授权 wx.requirePrivacyAuthorize
2. 触发授权事件 wx.onNeedPrivacyAuthorization
3. 弹窗,用户点击同意或拒绝
执行第 2 步的回调函数的 resolve 方法
4. 继续或终止流程
执行第 1 步的回调函数的 success 或者 fail 方法
5. 如果继续流程,调用隐私相关 api(录音、相册等等)或者 input (微信昵称)去聚焦
开发步骤:
开发前,先在小程序 app.json 配置中添加 "__usePrivacyCheck__": true
1. 开发弹窗,并且在需要的页面注册使用。“同意” 按钮需要符合规范
同意 不同意
如果需要查看隐私协议,可以使用 wx.openPrivacyContract({})
2. 使用 wxToPromise 方法,便于使用 await 处理相关接口
function wxToPromise (api, option) {
// API 存在判断
if (!api) {
wx.showModal({
title: '提示',
content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
})
return Promise.reject()
}
return new Promise((resolve) => {
api({
...option,
success (res) {
resolve([res, undefined])
},
fail (err) {
resolve([undefined, err])
},
})
})
}
3. app.ts 里在 onLaunch 方法里添加触发授权事件监听
// 导入弹窗的弹出方法
import { showModal } from './components/modal/showModal'
// 需要用户同意隐私授权时
if (wx.onNeedPrivacyAuthorization)
wx.onNeedPrivacyAuthorization(async (resolve) => {
// 触发弹窗
const [res] = await wxToPromise(showModal, {
title: '个人信息保护提示',
})
// 点击同意
if (res?.confirm) {
resolve({
buttonId: 'agree-btn',
event: 'agree'
})
// 点击拒绝
} else if (res?.cancel) {
resolve({
buttonId: 'disagree-btn',
event: 'disagree'
})
}
})
4. 封装请求隐私授权方法
import { wxToPromise } from './wxToPromise'
/**
* 请求隐私授权
* @return 是否已授权
*/
export const requirePrivacyAuthorize = async () => {
if (typeof wx.requirePrivacyAuthorize === 'function') {
const [res] = await wxToPromise(wx.requirePrivacyAuthorize)
if (res) return true
// < 2.33.2 基础库,无 api 默认已授权
} else {
return true
}
return false
}
5. 业务页面触发隐私授权,并且在回调里调用隐私接口
例如处理微信昵称时
// wxml
用户昵称
// js
/**
* 请求隐私授权
* 未授权时,input type="nickname" 会自动降级为 input type="text"
*/
async requirePrivacyAuthorize () {
if (wx.requirePrivacyAuthorize) {
[res, err] = await wxToPromise(wx.requirePrivacyAuthorize)
if (res) // 成功 - 继续调用隐私接口
if (err) // 失败 - 终止流程,或者走兜底方案
}
// PC 端 api 不存在,可以继续调用隐私接口
// 成功后去聚焦,失败后降级为普通文本框,依然去聚焦
this.setData({nickNameInputFocus: true})
}
如果只需要成功后,才执行后续逻辑。失败时不执行。
可以这样写:
async requirePrivacyAuthorize () {
// 请求隐私授权
if (!await requirePrivacyAuthorize()) return
this.setData({nickNameInputFocus: true})
}
例外情况,无需主动调用 requirePrivacyAuthorize,也能正常触发 wx.onNeedPrivacyAuthorization:
1. 写入剪贴板:wx.setClipboardData
2. 读取剪贴板:wx.getClipboardData
3. 获取微信头像:
常见问题:
1. 已经同意过隐私协议,如何清除掉状态?
答:把最近使用中的小程序删除
2. 如果不同意隐私协议,下次调用隐私接口时,还能触发 onNeedPrivacyAuthorization 吗?
答:可以
3. onNeedPrivacyAuthorization 多次注册,会重复监听吗?
答:会的,所以只在 app.js 里启动小程序时注册一次
4. 如果不使用 requirePrivacyAuthorize 主动触发,隐私协议和权限弹窗,哪个会先弹?
答:权限弹窗会先弹。如果拒绝权限后,不会弹隐私协议(onNeedPrivacyAuthorization 无法触发)
5. 隐私协议需要每个权限都弹一次吗?
答:如果用户同意了,则只弹一次,后续不再弹出,除非移除了小程序。如果用户一直拒绝,则需要每次调用权限之前弹出。
6. 以前我记得写入相册是系统弹窗,现在要改成自己写弹窗吗,还是说两个都要弹?
答:如果没有同意过隐私协议,并且没有授权过权限,两个都弹。
7. 如果版本是2.32.3 以下(不含)是否可以使用button的agreePrivacyAuthorization进行上报?
答:从基础库 2.32.3 开始,需要做适配的。这个基础库以下的版本,没有新增的几个 API,也就不需要做隐私协议的开发适配。只需要使用 if 判断下有没有方法就行。
例如:typeof wx.getPrivacySetting === 'function'
在 2.32.3 以下(不含),会返回 false,就直接跳过相关的隐私协议逻辑,不处理
8. 可以直接调用隐私接口吗?
答:可以但不建议。原因是有个 [bug] wx.onNeedPrivacyAuthorization 在原有授权弹窗之后触发的
https://developers.weixin.qq.com/community/develop/doc/000042e44347a0a201308a5de61800
9. PC 端如何处理?
答:PC 基础库虽然达到 2.32.3 了但目前没有 wx.getPrivacySetting 等新增的方法,因此目前无需处理
10. 企业微信环境里的小程序需要调整吗?
答:企业微信小程序,基础库比较落后,现在不需要。等基础库自动升级后,未来是需要的
11. 关于小程序隐私保护指引设置的公告,是否包括小程序里嵌入的h5页面?
A:暂不包括
相关资料地址:
官方 FAQ:
https://developers.weixin.qq.com/community/develop/article/doc/000c648556cb40603e406c0ac6b013
关于小程序隐私保护指引设置的公告
https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801
小程序隐私协议开发指南
https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/PrivacyAuthorize.html
欢迎来《墨问便签》小程序关注我