评论

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

关于新版隐私协议接口wx.onNeedPrivacyAuthorization的解读以及实现代码(二),添加了针对昵称输入框input的type="nickname"的代码

官方公告地址:

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

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


这是官方的Demo地址,也是每个页引用一个全局的组件,个人感觉太过于繁琐了,可以参考以下我整理的代码。

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


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

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

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

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

拒绝按钮可以加一个点击事件,然后在事件里这样写,官方demo里也没有加id。

<button class="btn-refuse" catch:tap="clickRefuse">拒绝</button>
refuse() {
    this.resolvePrivacyAuthorization({
      event: 'disagree'
    })
  },


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

<button id="agree-btn" class="btn-agree" open-type="agreePrivacyAuthorization"
 bindagreeprivacyauthorization="handleAgreePrivacyAuthorization">同意</button>


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

handleAgreePrivacyAuthorization() {
    this.resolvePrivacyAuthorization({
      buttonId'agree-btn',
      event'agree'
    })
  },


2、然后每个有隐私接口的页面引用自己的组件,代码如下

{
  "usingComponents": {
    "agreement""/components/agreement/agreement"
  }
}


布局引用

<!-- 隐私授权弹窗 -->
<agreement id="agreement" frameTitle="温馨提示" bind:refuse="refuse" bind:agree="agree"></agreement>


让组件弹窗显示,这样写: this.selectComponent('#agreement').show();


3、最后需要在用到隐私接口的页面的onShow里加上以下监听代码,在这里边让自定义的隐私弹窗显示出来即可。

  onShow: function () {
    let that = this;
    if (wx.onNeedPrivacyAuthorization) {
      wx.onNeedPrivacyAuthorization(resolve => {
        this.selectComponent('#agreement').show();//这里是让组件弹窗显示
        this.resolvePrivacyAuthorization = resolve
      })
    }
    }


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

//=======================以下是针对昵称输入框input的type="nickname"的代码===========================

注意:以下代码只是针对input另外加的,上边提到的代码也都要加上才能正常弹出弹窗

布局,在input的外层View加touch事件,然后加一个focus动态控制焦点。

<view catch:touchstart="handleTouchInput">
    <input type="nickname" class="text" bindinput="listenerContent" placeholder="输入名称" maxlength="10"
     value='{{name}}' focus="{{focus}}" />
</view>


然后,touch事件:

 handleTouchInput() {
    let that = this
    if (wx.getPrivacySetting) {
      wx.getPrivacySetting({//获取是否需要弹出
        successres => {
          if (res.needAuthorization) {
            wx.requirePrivacyAuthorize({//该接口请求隐私协议,会自动触发上边的wx.onNeedPrivacyAuthorization
              success() => {
                that.setData({
                  focustrue,
                })
              },
              fail() => {},
              complete() => {}
            })
          } else {
            that.setData({
              focustrue,
            })
          }
        },
        fail() => {},
        complete() => {}
      })
    } else {
      this.setData({
        focustrue
      })
    }
  },


这样就可以了,记得把上边提到的监听代码都加上。

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

37 个评论

  • 我们安安分分
    我们安安分分
    2023-09-12

    大佬,我是用uni开发的,监听放在app.vue的onShow里面,代码是这样的,现在用到隐私的地方比较多,然后隐私组件页面每次销毁的时候,调用拒绝隐私事件,结果一直上报不了拒绝事件,这是咋回事?救救孩子,孩子快要鸡了。

    2023-09-12
    赞同
    回复 4
    • 我们安安分分
      我们安安分分
      2023-09-13
      已解决,对着官方案例改的,
      2023-09-13
      回复
    • 青提柚柚
      青提柚柚
      2023-09-13
      你的隐私方法onNeedPrivacyAuthorization可以触发嘛?
      2023-09-13
      回复
    • 依旧、
      依旧、
      2023-09-13
      能贴一下代码吗
      2023-09-13
      回复
    • 周易
      周易
      2023-09-13回复我们安安分分
      能贴一下代码吗?
      2023-09-13
      回复
  • null&null
    null&null
    2023-09-07

    我想知道我点击一个上传文件api这时候触发了授权弹窗,那么流程是不是得点击两遍?第一次点击是授权,第二次才是正常功能使用?

    2023-09-07
    赞同
    回复 2
    • 一笑皆春
      一笑皆春
      2023-09-07
      不用,授权只是一个拦截,用户点同意后会自动继续上传
      2023-09-07
      回复
    • null&null
      null&null
      2023-09-07回复一笑皆春
      但目前我在开发工具上搞的弹窗点击同意后设置弹窗消失和其他内容都没有触发。
      2023-09-07
      回复
  • 离岸°
    离岸°
    2023-09-06

    wx.getSetting 这样的api不同意隐私协议也用不了,而且文档也没有配置这个的信息类型,这怎么搞呢?谢谢

    2023-09-06
    赞同
    回复
  • 想🍑
    想🍑
    2023-09-05

    onLoad(() => {

        console.log(wx.onNeedPrivacyAuthorization, 'wx.onNeedPrivacyAuthorization'); //由当前方法

        if (wx.onNeedPrivacyAuthorization) {

            wx.onNeedPrivacyAuthorization((resolve: any) => {

                console.log('触发了请求'); //一直走不到这步 3.0.1/3。0.0

                // 需要用户同意隐私授权时

                // 弹出开发者自定义的隐私授权弹窗

                resolvePrivacyAuthorization.value = resolve;

                console.log(resolve, 'resolve');

                console.log(authDialogComponent.value, 'auth.value');

                authDialogComponent.value.showEdit();

            });

        }

    });


    这么写 但是一直无效 无语 上周还有效果的

    2023-09-05
    赞同
    回复 2
    • 一笑皆春
      一笑皆春
      2023-09-05
      写在onShow里
      2023-09-05
      回复
    • 青提柚柚
      青提柚柚
      2023-09-13回复一笑皆春
      大佬 我现在写在onShow也触发不了,怎么办哇?基础库是最新的3.0.2
      2023-09-13
      回复
  • 那个男人
    那个男人
    2023-09-04

    进入页面,使用 api onNeedPrivacyAuthorization 监听后,调用隐私接口。开发工具点击 同意。然后微信自动再次调用 隐私接口。但此时报错 Msg":"chooseImage:fail privacy permission is not authorized or buttonId is wrong","errno":104} 这是为啥捏


    2023-09-04
    赞同
    回复 2
    • dada
      dada
      2023-09-07
      同样的问题
      2023-09-07
      回复
    • 那个男人
      那个男人
      2023-09-14回复dada
      我使用的taro框架,因为框架未升级导致的
      2023-09-14
      回复
  • 小花
    小花
    2023-08-31
    resolvePrivacyAuthorization 
    

    这是在哪里声明的?


    2023-08-31
    赞同
    回复 5
    • 珂珂
      珂珂
      2023-08-31
      我是在公共变量中声明使用的:app.globalData.resolvePrivacyAuthorization = resolve;
      2023-08-31
      回复
    • 。
      2023-08-31
      2023-08-31
      回复
    • 。
      2023-08-31回复珂珂
      为啥阿
      2023-08-31
      回复
    • 珂珂
      珂珂
      2023-09-01回复
      我是 this.resolvePrivacyAuthorization 会报 is not a function,所以加了个全局变量来保存resolve
      2023-09-01
      回复
    • 神经蛙
      神经蛙
      2023-09-04回复
      你解决了吗,我也无法console
      2023-09-04
      回复
  • 小花
    小花
    2023-08-31

    各位大佬遇到以下问题了吗?隐私协议页面,我们需要新建一个页面来显示隐私协议里面的内容吗,我现在遇到的问题是点击查看隐私协议,我输出的res内容为 errMsg: "openPrivacyContract:ok",然后页面什么反应也没有,也没有打开隐私协议页面,现在我的代码是

    <button @click="handleOpenPrivacyContract">查看隐私协议</button>
    
    handleOpenPrivacyContract() {
        
        // 打开隐私协议页面
        wx.openPrivacyContract({
            success: res => {
                console.log("打开隐私协议页面--res===>打开隐私协议页面",res)
            }, // 打开成功
            fail: () => {}, // 打开失败
            complete:() => {}
        })
    },
    
    2023-08-31
    赞同
    回复 4
    • 珂珂
      珂珂
      2023-08-31
      手机上预览可以看到吧?
      2023-08-31
      回复
    • 小花
      小花
      2023-08-31回复珂珂
      手机上预览也看不到
      2023-08-31
      回复
    • 小花
      小花
      2023-08-31回复小花
      点完之后页面没有反应
      2023-08-31
      回复
    • 小花
      小花
      2023-08-31回复珂珂
      手机上真机调试可以,谢谢!
      2023-08-31
      回复
  • Nana
    Nana
    2023-08-30

    突然变成默认同意了,之前删除小程序,重新进入还可以继续弹框,现在不行了,有谁碰到了吗?


    2023-08-30
    赞同
    回复
  • 努力努力再努力x
    努力努力再努力x
    2023-08-30
    大兄弟,你放在onShow里面进行监听干啥呢,这样每次进入这个页面不就重复执行了吗,onNeedPrivacyAuthorization执行一遍就可以了
    
    2023-08-30
    赞同
    回复
  • flowerRed
    flowerRed
    2023-08-28

    我现在的代码 是权限在去对应功能页面之前就判断(用原来的一些方法和自定义弹窗)。修改后还是在跳转之前判断吗?还是在跳转到对应页面后也需要判断。

    2023-08-28
    赞同
    回复

正在加载...

登录 后发表内容