背景
微信更新了隐私条款,需要用户授权才能调用隐私相关接口。
公告:https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801?blockType=1
需要授权的隐私接口:https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html
官方提供API简介
目前共有4个接口:
wx.requirePrivacyAuthorize:模拟隐私接口调用,在用户未点击隐私接口的时候,可以通过这个接口主动触发。
wx.openPrivacyContract: 跳转至隐私协议页面。
wx.onNeedPrivacyAuthorization:监听用户调用隐私接口的行为。
wx.getPrivacySetting:查询当前隐私授权情况。
实现思路
有以下几个目标:
- 新增代码量少
- 不影响既存业务逻辑
- 减少对用户操作体验的影响
基于上面的目标,决定通过以下步骤实现:
- 使用onNeedPrivacyAuthorization在app.js的onLaunch中启动全局监听
- 新建一个隐私授权页面,用于用户授权
- 在任意位置监听到未授权调用,跳转到授权页面(如果要进入即触发,可以使用wx.requirePrivacyAuthorize接口)
- 用户在授权页【确认】或【取消】后,返回调用前的页面
PS:由于项目部分业务逻辑必须要使用隐私接口提供的信息,所以这里设计成如果用户不授权,就会反复跳转的授权页面。(或者直接关闭小程序)。
只要在这个单独的隐私授权页授权,其他页面的隐私接口也都能使用。减少了复杂度。
实践
demo只有两部分修改;
1.app.js中增加监听
2.新增隐私授权页面
先放代码片段:https://developers.weixin.qq.com/s/gAdAxPmd7eKV
需要使用已经配置隐私保护指引的appid,demo使用了获取手机号的接口,可以自行更换。
- 设置《小程序用户隐私保护指引》
开发前需要现在小程序后台配置隐私保护指引,项目内用到隐私接口都需要在这里声明。
隐私保护指引填写说明:https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/
详细实现:
- 开发环境配置
1.app.json 增加"usePrivacyCheck": true;
2.基础库版本调整为3.0.1。官方基础库要求是2.23以上,这里直接用最新的基础库进行调试。
// app.json
{
"pages": [
"pages/index/index",
"pages/privacy/index"
],
"__usePrivacyCheck__": true
}
- 小程序启动时,监听隐私接口调用
通过if(wx.onNeedPrivacyAuthorization)兼容基础库。
监听到未授权用户调用隐私接口后,跳转到隐私授权页。
如果需要进入小程序,立即触发跳转,可以使用wx.requirePrivacyAuthorize()接口模拟隐私接口调用
// app.js
App({
onLaunch() {
if (wx.onNeedPrivacyAuthorization) { // 兼容基础库
wx.onNeedPrivacyAuthorization(resolve => {
wx.navigateTo({
url: '/pages/privacy/index', // 跳转到隐私授权页面
})
this.globalData.privacyResolve = resolve // 监听事件的回调接口函数注册到全局变量
})
}
// 进入小程序立即触发
// wx.requirePrivacyAuthorize()
},
globalData: {
privacyResolve: '',
},
})
- 隐私条款页面
根据用户操作告知微信用户选择,并返回触发隐私接口的页面。
// pages/privacy/index.js
const APP = getApp();
Page({
handleAgreePrivacyAuthorization() {
// 用户点击同意按钮后
APP.globalData.privacyResolve({ buttonId: 'agree-btn', event: 'agree' })
wx.navigateBack()
// 用户点击同意后,开发者调用 resolve({ buttonId: 'agree-btn', event: 'agree' }) 告知平台用户已经同意,参数传同意按钮的id。为确保用户有同意的操作,基础库在 resolve 被调用后,会去检查对应的同意按钮有没有被点击过。检查通过后,相关隐私接口会继续调用
// 用户点击拒绝后,开发者调用 resolve({ event:'disagree' }) 告知平台用户已经拒绝
},
handleDisagree() {
APP.globalData.privacyResolve({ event: 'disagree' })
wx.navigateBack()
},
openPrivacy() {
wx.openPrivacyContract()
}
})
- 错误处理
根据官方文档wx.onNeedPrivacyAuthorization触发时,触发该事件的隐私接口或组件会处于 pending 状态。用户操作完后,触发该事件的隐私接口会继续执行。
所以用户拒绝授权,返回原页面后,隐私接口会报出errno=104的错误,这个错误需要进行处理。如果用户拒绝直接关闭小程序则没有这个问题。
一些问题
调查中还遇到了一些问题,希望官方或者有知道的大佬能回答一下
1.这种强制用户授权的操作,是否合规,审核能通过吗?
2.获取nickName的input框 <input type=“nickname”>似乎无法触发wx.onNeedPrivacyAuthorization。点击后直接弹出了普通输入框,上方没有用户快捷输入昵称的按钮。这个是feature?
关于问题2现在的处理是,直接使用了wx.requirePrivacyAuthorize()接口触发,让用户授权后,再点input。
可以用navigateTo回调事件,这样全局变量也用不到
success: res => res.eventChannel.emit('postResolve', resolve)
const eventChannel = this.getOpenerEventChannel(); eventChannel.on('postResolve', (resolve) => { this.resolveMethod = resolve; });
楼主有没有遇到这种:点完同意之后有的隐私api会走回调success但是实际操作不成功的情况,比如设置粘贴板内容,wx.setClipboardData