微信小程序之权限篇讲解

作者: 甚时跃马归来 | 来源:发表于2019-05-09 14:53 被阅读37次

    0、前言

    一直以来,小程序的授权都是极其灵活(混乱的(小声bb)),加之文档又没写明白,所以今天来捋一捋。

    小程序调起授权的方式有3种:

    一是直接使用相关api时自动调起,例如调用wx.chooseAddress(),只要你之前没有授权或拒绝过,就会出现允许调用通讯地址授权窗口;

    二是使用预授权,像下方代码也可以调起对应的授权窗口;

      wx.authorize({
          scope: 'scope.invoiceTitle',
          success:function(res){
            console.log('发票抬头授权成功');
          },
          fail:function(err){
            console.log('发票抬头授权失败');
          },
          complete:function(){
            console.log('complete')
          }
        })
    

    三是组件方式,例如使用button按钮,像获取用户数据,手机号等;

    除此之外,用button触发的授权方式可以无限调起授权窗口(只要之前没成功就能无限调起),而用api触发的只能调起一次(无论成功或失败)

    再除此之外,小程序还有wx.getSetting(),可以获取到已申请的所有的权限的授权结果(通过对应的字段的true或false来标识)

    再再除此之外,本来由于api触发只能调起一次授权窗口,那么利用wx.getSetting()获取到用户已拒绝的情况下,还可以利用跳转设置页(wx.openSetting())的方式引导用户重新打开授权。但...这个跳转设置页的api又被封了(2.3.0之后不能用)...,后面只能通过button的方式来跳转设置页...

    1、小程序开放的授权

    小程序官方将授权划分为了以下几种。

    scope 对应接口 描述
    scope.userInfo wx.getUserInfo(已废弃) 用户信息
    scope.userLocation wx.getLocation, wx.chooseLocation 地理位置
    scope.address wx.chooseAddress 通讯地址
    scope.invoiceTitle wx.chooseInvoiceTitle 发票抬头
    scope.invoice wx.chooseInvoice 获取发票
    scope.werun wx.getWeRunData 微信运动步数
    scope.record wx.startRecord 录音功能
    scope.writePhotosAlbum wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum 保存到相册
    scope.camera <camera /> 组件 摄像头

    眼尖的话,你可能还发现,用户手机号没有在里面。因为手机号未对个人开发者开放,所以这里没有把它列出来。(测不到)

    2、授权触发方式

    上文表格中列举了我们日常开发中所能够用到的权限,但是因为获取用户userInfo和其他的不同,所以我们还需要将它们再次进行划分分类,划分依据就是 授权触发方式!

    根据授权触发方式,我们可以将上面的权限再次划分为 手动触发api触发

    手动触发:
    scope.userInfo

    api触发:
    除了scope.userInfo 之外的权限

    手动触发和api触发有什么不同?

    先抛结论:
    1、api触发的,授权窗口只弹出一次;手动触发的,授权窗口可以弹出无限次(只要没允许授权之前每次点击都会触发)

    2、api触发的,可以预授权。

    3、示例(获取发票抬头和用户信息)

    首先有这么以下一段代码:

    <!-- wxml -->
    <button open-type="openSetting" bindopensetting="callback">打开设置页</button>
    <button open-type="getUserInfo" bindgetuserinfo='getInfo'>获取用户信息</button>
    
     // js
     getInfo(res){
      console.log(res)
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
        console.log('onshow');
        wx.chooseInvoiceTitle({
          success: function (res) {
            console.log('获取到微信抬头')
            console.log(res)
          },
          fail: function (err) {
            console.log('获取微信抬头失败');
          },
          complete: function (all) {
            console.log('获取微信抬头complete')
          }
        })
        // wx.authorize({
        //   scope: 'scope.invoiceTitle',
        //   success:function(res){
        //     console.log('发票抬头授权成功');
        //   },
        //   fail:function(err){
        //     console.log('发票抬头授权失败');
        //   },
        //   complete:function(){
        //     console.log('complete')
        //   }
        // })
      },
      onHide: function () {
        console.log('页面onhide')
      },
    
    

    页面展示如下:


    页面.png

    我们看这段代码,页面上有2个按钮,1个是打开设置页,1个是获取用户信息。然后在onshow()方法中获取发微信票抬头,保存并清除掉所有权限,然后启用真机调试!

    首先页面加载好就是一个授权弹框提示:


    发票抬头授权.png

    我们选择拒绝,然后查看打印的数据:


    发票抬头_日志.png

    然后切到其他页面再切回来,查看打印的数据:


    发票抬头_日志2.png

    再多试几次,还是同样的结果。同样的,你清除掉缓存,再次调试,选择同意授权,此时会进入获取发票抬头的页面,如下:


    发票抬头_具体.jpg

    然后每次切换页面再回来,你会发现已经不用再弹出窗口就可以获取发票抬头了。

    然后点击获取用户信息的按钮,弹出授权窗口(不知道你注意没,右边的按钮是允许,但左边的按钮叫取消,而不是拒绝!

    用户信息.png

    然后点取消,再点获取用户信息的按钮,又会弹出来。你可以多试几次,然后点允许之后,之后再点就没有弹窗了。

    从以上现象我们可以得出这么一个结论:

    api触发授权窗口,无论成功或者失败,授权窗口只弹出一次!而手动触发的授权窗口,只要之前没成功就会一直弹出!

    4、预授权(wx.authorize())

    然后我们改造一下上面的代码,如下:

    <!-- wxml -->
    <button open-type="openSetting" bindopensetting="callback">打开设置页</button>
    <button open-type="getUserInfo" bindgetuserinfo='getInfo'>获取用户信息</button>
    <button bindtap='getInvoiceTitle'>获取发票抬头</button>
    
    //js
    onShow: function () {
        console.log('onshow');
        wx.authorize({
          scope: 'scope.invoiceTitle',
          success:function(res){
            console.log('发票抬头授权成功');
          },
          fail:function(err){
            console.log('发票抬头授权失败');
          },
          complete:function(){
            console.log('complete')
          }
        })
      },
    
      getInvoiceTitle(){
        wx.chooseInvoiceTitle({
          success: function (res) {
            console.log('获取到微信抬头')
            console.log(res)
          },
          fail: function (err) {
            console.log('获取微信抬头失败');
          },
          complete: function (all) {
            console.log('获取微信抬头complete')
          }
        })
      },
    
    

    在上面这段代码中,我们使用wx.authorize()方法进行了预授权,将授权和获取发票分开。
    同样的,授权窗口也是只弹出一次,无论你选择了允许还是拒绝。

    并且由于,wx.getUserInfo()的废弃,所以获取用户信息无法进行预授权。
    所以,使用api方式触发授权的权限,可以进行预授权,手动触发授权的权限无法进行预授权。

    5、wx.getSetting()

    wx.getSetting()只有一个作用,那就是查看你申请过的所有权限的授权结果,结果是一个true 或者 false!
    例如我的小程序中,有允许过 用户信息,拒绝了发票抬头。在button中调用wx.getting(),

    <!-- wxml -->
    <button bindtap='getAuthSetting'>获取授权数据</button>
    
    // js
     getAuthSetting(){
        wx.getSetting({
          success: function (res) {
            console.log(res)
           // 查看具体某个权限的授权方式是用以下方法,而不能用res.authSetting.scope.userInfo
            console.log(res.authSetting['scope.userInfo'])
          },
          fail: function (err) {
            console.log(err)
          },
          complete: function () {
            console.log('complete')
          }
        })
      },
    

    最后打印结果如下:


    微信图片_20190525164225.png

    6、打开设置页(wx.openSetting()或者是 <button open-type='openSetting'>打开设置页</button>)

    2.3.0版本之前,可以通过wx.openSetting()来引导用户重新授权,2.3.0之后只能通过Button的方式来引导了。

    它们的效果是一样,如下图:

    wx.openSetting()调用效果.png

    并且在成功回调中,都返回有最新的所有权限的授权数据。

    如,wx.openSetting()中success回调方法中打印的数据:

    wx.openSetting()的success回调打印数据.png

    如,<button open-ype="openSetting" bindopenSetting="openS2">打开设置页2</button>的成功回调方法打印数据

    button的open-type='openSetting'的成功回调.png

    它们的代码如下:

    <!-- wxml -->
    <button bindtap='openS'>打开设置页1</button>
    <button open-type='openSetting' bindopensetting='openS2'>打开设置页2</button>
    
    // js
     openS(){
        wx.openSetting({
          success:function(res){
            console.log('opensetting')
            console.log(res)
          },
          fail:function(){
          },
          complete:function(){
          }
        })
      },
      openS2(res){
        console.log(res)
      },
    

    7、总结

    在本篇文章中,我们按照授权触发方式,简单地将它们分为2部分,1是api触发,2是button触发(通过open-type)。

    1、api触发的
    可以通过预授权触发授权弹窗或者是到调用的时候由系统触发弹窗,但要注意的是,通过api触发的,只能触发一次授权弹窗(无论成功或失败),需要做好相关的兼容(如wx.getSetting() 查看授权数据和wx.openSetting()/ button open-type=openSetting打开设置页引导用户重新授权等)。

    2、通过button触发的授权(如用户信息,手机号等),由于可以无限触发授权窗口(授权未成功之前),因此来说,兼容问题要少一点。

    一般来说,如果需要的权限少,可以在启动时采用预授权,然后在对应页面做好兼容判断等;如果需要的权限多的话,建议在各个模块的时候再授权(或者是用到的时候直接调用,让系统调起授权窗口),这样的话用户就不至于觉得,这什么东西,怎么要那么多权限啥的。

    相关文章

      网友评论

        本文标题:微信小程序之权限篇讲解

        本文链接:https://www.haomeiwen.com/subject/rjpwoqtx.html