评论

隐私条款demo--全局监听无侵入

通过全局监听隐私接口的触发,让用户在独立的隐私条款授权页授权,对应隐私条款的更新。

背景

微信更新了隐私条款,需要用户授权才能调用隐私相关接口。
公告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使用了获取手机号的接口,可以自行更换。

详细实现:

  • 开发环境配置
    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。

最后一次编辑于  2023-08-29  
点赞 0
收藏
评论

2 个评论

  • LuoGang
    LuoGang
    2023-09-05

    可以用navigateTo回调事件,这样全局变量也用不到

    success: res => res.eventChannel.emit('postResolve', resolve)
    


    const eventChannel = this.getOpenerEventChannel();
    eventChannel.on('postResolve', (resolve) => {
      this.resolveMethod = resolve;
    });
    
    2023-09-05
    赞同 1
    回复
  • 野孩子
    野孩子
    2023-08-31

    楼主有没有遇到这种:点完同意之后有的隐私api会走回调success但是实际操作不成功的情况,比如设置粘贴板内容,wx.setClipboardData

    2023-08-31
    赞同
    回复 1
    • ⅴ
      2023-08-31
      暂时没有遇到,有没有可能是手机的剪切板权限设置问题。
      2023-08-31
      回复
登录 后发表内容