评论

关于新版隐私协议接口wx.onNeedPrivacyAuthorization的适配解读以及实现代码

关于新版隐私协议接口wx.onNeedPrivacyAuthorization的适配解读以及实现代码

官方公告地址:

https://developers.weixin.qq.com/community/develop/doc/00042e3ef54940ce8520e38db61801

目前,开发工具或者体验版的小程序,调试基础库如果是2.33.0及以上就得适配了,线上版本9月15日之后生效,所以这之前需要尽快改完,发布一版,否则到了9月15号之后 线上就会生效报错了。

其实改起来也很简单,以下是实现步骤和代码:

1、首先看一下这个网址,里边包含涉及到的隐私的接口,这些接口都要适配一下

https://developers.weixin.qq.com/miniprogram/dev/framework/user-privacy/miniprogram-intro.html

在以上接口用到的页面,需要画一下类似上边的弹窗(这个弹窗可以全局定义个组件,方便多个页面共用),然后里边蓝字可以点击后调用wx.openPrivacyContract(Object object)接口即可,会自动跳转打开隐私协议页面。

拒绝按钮可以加一个点击事件,然后在事件里这样写

同意按钮比较特殊,布局需要用button这样写,记得给button加一个Id

然后在handleAgreePrivacyAuthorization里就可以获取到点击事件,这样写

2、最后需要在onLoad或者onShow里加上以下监听代码,在这里边让自定义的隐私弹窗显示出来即可。


以上代码加上就可以了,如果业务逻辑用到了需要判断是否授权过,可以加上 wx.getPrivacySetting(Object object)去获取是否授权过,用不到可以不加这个判断。

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

84 个评论

  • 林
    2023-08-16

    请教一下楼主,同一个页面如果使用了不同的api(比如使用到【拍照】、【获取地理位置】),这些api都需要做这个处理吗?

    2023-08-16
    赞同
    回复 3
    • 一笑皆春
      一笑皆春
      2023-08-16
      加这些代码与api没关系,一个页面内不管有几个,你加上这个代码用户授权一次就可以了
      2023-08-16
      回复
    • 藻雪
      藻雪
      2023-08-16
      拒绝或者同意之后是自己关闭弹窗?
      2023-08-16
      回复
    • 千羽
      千羽
      2023-08-28回复一笑皆春
      但是这些api 都会触发onNeedPrivacyAuthorization 监听吧,我在监听里面显示了用户协议弹窗,那这样的话会多次显示弹窗呀
      2023-08-28
      回复
  • 藻雪
    藻雪
    2023-08-16

    目前我封装了一个全局组件

    问题:授权一次就可以了吗?还是说每涉及一次隐私接口就要拉起弹窗授权一次?我的理解是:

    1.用户进入小程序在app.onshow中调用wx.getPrivacySetting,如果用户没有授权则拉起弹窗用户授权,本地存储授权状态;

    2.进入其他页面后涉及使用隐私api时先wx.getPrivacySetting获取是否授权,授权则不做反应继续往下调用那些隐私接口,反之拉起授权弹窗用户授权,弹窗关闭之后业务再进行下去再检查是否授权重复流程2。

    疑问:如果用户未授权是不是每涉及一个隐私接口调用,都要引入这个组件弹窗,然后等用户同意?

    2023-08-16
    赞同
    回复 2
    • yi
      yi
      2023-08-17回复BOBO
      同问
      2023-08-17
      回复
    • sine
      sine
      2023-08-17回复BOBO
      授权A后,ABC都授权了
      2023-08-17
      2
      回复
  • 千羽
    千羽
    2023-08-16

    博主,我的基础调试库是 【2.24.7】,没有超过【2.33.0】,还需要添加这一套流程吗?

    2023-08-16
    赞同
    回复 1
    • ╭ァPoppyっ
      ╭ァPoppyっ
      发表于移动端
      2023-08-16
      基础库是用户侧的东西吧,开发者没法指定基础库版本吧,还是我理解有问题?
      2023-08-16
      回复
  • 积玉
    积玉
    2023-08-16

    有个问题 为什么我一直没有弹窗。我调用getPrivacySetting默认返回false

    2023-08-16
    赞同
    回复 1
  • 搁、浅
    搁、浅
    2023-08-16

    企业微信里面能调用这些新增的API吗

    2023-08-16
    赞同
    回复 1
    • 夏味
      夏味
      2023-08-16
      不能,基础库版本不够高
      2023-08-16
      回复
  • ʚ🐽ɞ
    ʚ🐽ɞ
    2023-08-16

    onNeedPrivacyAuthorization 直接放在app.js 里面吧,事件往上抛,抛到最后到app.js 里面,然后获取当前页,然后把当前页的 agreement dialog 展示出来

    2023-08-16
    赞同
    回复 1
    • ʚ🐽ɞ
      ʚ🐽ɞ
      2023-08-16
      就是 每一个隐私的 接口 包含的wxml 都要加 agreement dialog 组件,就比较麻烦,用微信自己的modal 貌似又不行
      2023-08-16
      回复
  • 小熊🧸
    小熊🧸
    2023-08-16

    有不同的页面 但是都调用了相同的api 那第一个api授权后 之后的还需不要弹框呢

    

    2023-08-16
    赞同
    回复 2
    • 小熊🧸
      小熊🧸
      2023-08-16回复一笑皆春
      我滴妈  好多好多页面
      2023-08-16
      回复
    • 小熊🧸
      小熊🧸
      2023-08-16回复一笑皆春
      谢谢楼主回答 你的文章会给我很大帮助 找来找去才看到很简单明了的文章
      2023-08-16
      回复
  • 啊哈
    啊哈
    2023-08-16

    这一套流程倒是简单,但是还有些问题不清晰:

    1、如果真的需要用户授权的时候,页面上的相关组件、onLoad中调用的api等,需不需要等用户同意之后开发者手动的重新渲染和调用?

    2、onNeedPrivacyAuthorization返回的resolve,上报的时候应该是异步的,会不会道之上报之后直接调用相关api还是没有权限?开发者需要轮训getPrivacySetting返回的是否授权过?

    3、对于应用场景复杂的程序,不同场景多个启动页面,都要处理授权和重新渲染、调用逻辑,工作量太大了

    4、还有就是用户同意授权是通过按钮触发,开发者是不是可以把弹窗两个按钮都用agreePrivacyAuthorization,甚至整个弹窗都用这个按钮覆盖着,用户点哪里都是同意?

    2023-08-16
    赞同
    回复 3
    • 夏味
      夏味
      2023-08-16
      你对流程的理解不正确,getPrivacySetting 其实是用不到的一个 api。除非你要做埋点和日志上报
      2023-08-16
      回复
    • 啊哈
      啊哈
      2023-08-16回复夏味
      如果不用的话,是不是就说明onNeedPrivacyAuthorization返回的resolve是一个同步接口,只要调用了相关的组件、API就能立即正常使用了?
      2023-08-16
      回复
    • 啊哈
      啊哈
      2023-08-16回复啊哈
      开发者主动触发的流程清楚了,requirePrivacyAuthorize的success表示resolve了同意,fail表示resolve了拒绝。感谢
      2023-08-16
      回复
  • ╭ァPoppyっ
    ╭ァPoppyっ
    发表于移动端
    2023-08-16
    这个是整个小程序授权一次就可以,还是每个调用了相关api的页面都需要写这么一套东西?
    2023-08-16
    赞同
    回复 2
    • 2023-08-16
      可不可以在app.js里面判断一下有没有授权,然后跳到一个单独的隐私授权页统一进行授权是不是就可以不用在每个页面去单独写了
      2023-08-16
      回复
    • ╭ァPoppyっ
      ╭ァPoppyっ
      发表于移动端
      2023-08-16
      我想知道这东西用户同意了之后能不能手动给关了,像楼主这样在onshow里边申请了,但是api是点了某个按钮才调用的,用户点了同意又给关了那不完蛋了。
      2023-08-16
      回复
  • 夏味
    夏味
    2023-08-16

    补充下,获取微信昵称组件,无法触发 onNeedPrivacyAuthorization,需要使用 wx.requirePrivacyAuthorize 来处理

    2023-08-16
    赞同
    回复 5
    • 夏味
      夏味
      2023-08-16回复一笑皆春
      不是这个原因,官方文档里有写,我也找微信的人问过。
      2023-08-16
      回复
    • sine
      sine
      2023-08-17回复夏味
      是的,<input type="nickname"> 组件不会触发 onNeedPrivacyAuthorization 事件,需要注意下。可以通过其他方法兼容,比如 wx.requirePrivacyAuthorize 返回 success 后,或者 wx.getPrivacySetting 返回 needAuthorization === false 后,再使用 nickname 组件
      2023-08-17
      1
      回复
    • 夏味
      夏味
      2023-08-18回复sine
      是的,最好是在父级使用 catch:touchstart="requirePrivacyAuthorize",等返回 success 后再设置 focus: true 来触发 input 聚焦
      2023-08-18
      回复
    • sine
      sine
      2023-08-18回复夏味
      是个好方法
      2023-08-18
      回复
    • 珎邜
      珎邜
      2023-08-24回复sine
      this.resolvePrivacyAuthorization is not a function 怎么办呀
      2023-08-24
      回复

正在加载...

登录 后发表内容