问题:

在首次进入小程序时,我们常常会收到一些获取权限的申请,比如「获取地理位置权限」、需要微信登录时请求「获得你的公开信息(昵称、头像等)」。对于这些权限申请,开发者当然希望获得所有权限,而用户拒绝授权的情况不免存在。那么作为开发人员在考虑「用户拒绝授权」这类异常情况出现时,应该提前做好未获得授权时的兼容处理,以及用户希望授权时的再次提醒。

查看官方文档:

授权

部分接口需要经过用户授权同意才能调用。我们把这些接口按使用范围分成多个scope,用户选择对 scope来进行授权,当授权给一个scope之后,其对应的所有接口都可以直接使用。此类接口调用时:

  • 如果用户未接受或拒绝过此权限,会弹窗询问用户,用户点击同意后方可调用接口;
  • 如果用户已授权,可以直接调用接口;
  • 如果用户已拒绝授权,则不会出现弹窗,而是直接进入接口 fail 回调。请开发者兼容用户拒绝授权的场景。

......

授权有效期

一旦用户明确同意或拒绝过授权,其授权关系会记录在后台,直到用户主动删除小程序。

最佳实践

在真正需要使用授权接口时,才向用户发起授权申请,并在授权申请中说明清楚要使用该功能的理由。

分析:

官方文档,并没有给出明显的说明和解决示例,但是我们还是可以通过上面这句话得到解决方式,当用户拒绝授权后调用授权弹窗接口 wx.authorize,不会再次出现弹窗,但是会进入接口的fail回调,那我们就可以在fail回调里想办法再次进行授权操作,肯定不能调用 wx.authorize,那应该怎么办呢?通过查资料我们发现,微信小程序其实是有一个设置功能界面的,在设置界面里面我们可以对小程序进行再次授权。然而,通过官方文档我们可以知道,有一个API可以实现打开设置界面的功能,就是wx.openSetting可以调起客户端小程序设置界面,返回用户设置的操作结果。但是设置界面只会出现小程序已经向用户请求过的权限,我们可以按照这个思路解决问题。

示例代码:

// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scope
    wx.getSetting({
      success(res) {
        console.log(!res.authSetting['scope.userLocation']);
        if (!res.authSetting['scope.userLocation']) {
          wx.authorize({
            scope: 'scope.userLocation',
            success() {
              // 用户已经同意
              //其他操作...
              console.log("用户已经同意位置授权");
            },
            fail(){
              console.log("用户已经拒绝位置授权");
              that.openConfirm();//如果拒绝,在这里进行再次获取授权的操作
            }
          })
        }
       //其他操作..
      }
    });

//再次获取授权
//当用户第一次拒绝后再次请求授权
  openConfirm: function () {
    wx.showModal({
      content: '检测到您没打开此小程序的定位权限,是否去设置打开?',
      confirmText: "确认",
      cancelText: "取消",
      success: function (res) {
        console.log(res);
        //点击“确认”时打开设置页面
        if (res.confirm) {
          console.log('用户点击确认')
          wx.openSetting({
            success: (res) => { }
          })
        } else {
          console.log('用户点击取消')
        }
      }
    });
  }

 

最后修改于 2019-09-03 20:49:29
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇