scope 参数错误或没有 scope 权限_如何跟微信小程序中的权限过招

739dd9a2ea9c19814c6b46628cf7b8dd.png

文章:王栋(北京中心)

排版:suny

在开发小程序的过程中我们或多或少的都会跟权限相关的API打交道。最常用的就是获取用户信息:偏分享类的小程序会用到保存图片到相册;电商类的小程序则更多会用到获取定位/打开地图的功能;健身类小程序则获取微信步数多一点……

当然不仅限于这些情况和场景。但是如果开发者对小程序的权限处理不当,可能会造成应用假死的现象,对用户造成极差的体验。倘若我们的开发中用到了权限相关的API,我们该如何亮剑呢?

ee383f2d12845929d024e8dca960d186.png 前  言

俗话说知己知彼才能百战不殆,狭路相逢对于我们开发者来说并不是勇者胜而是知者胜,我们需要对权限的使用有足够的了解才能发现它设下的许多障眼法,避开雷区,进而找到适合我们自己并且能够达到目的的道路。

接下来我们从权限的申请方式、每种方式使用的注意点和遇到的问题以及如何解决等几个方面来,再配合几个小例子重新梳理一下权限使用规则。

ee383f2d12845929d024e8dca960d186.png 权限申请方式 目前小程序中可以通过两种方式来申请权限:
  • 通过 button 的 open-type 方式来获取相应的权限及信息。
  • 通过 wx.authorize()和wx.openSetting() 两个接口来申请相应的权限。

1. 通过button申请权限

通过button获取权限对于开发者来说相对简单一些,开发者只需要绑定相应的回调函数即可,权限申请的成功和失败都可以在回调函数中处理。而且无论用户在申请权限的时候拒绝还是通过,每次获取权限都会弹出权限处理弹窗,无需开发者进行过多的兼容操作。

其实我们可以把通过button申请权限的方式当作普通的信息获取接口,只不过这个接口必须通过button组件来调用而已。

2. 通过wx.authorize()来申请权限

通过wx.authorize()来申请权限的方式才是我们的重头戏,这种方式是比较繁琐的。因为它的状态比较多,大致可分为:

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

针对这三种状态,开发者的处理的情况也有所不同。

b2c7712ff529227e9a4beb5c4017f79c.png

上述情况中我们还需要wx.getSetting()和wx.openSetting()来配合使用,其中wx.getSetting()可以理解为获取当前权限设置列表信息,wx.openSetting()则是打开权限设置面板,二者都是帮助用户进行一个完整授权过程的。 但是这个 openSetting 打开设置页面的过程让开发者比较抓狂。自2.3.0 版本开始,只有用户发生点击行为后,才可以跳转打开设置页,也就是说 openSetting 只能通过 button 组件或点击(bindtap)的回调函数里来调用。然而我们在申请权限的时候无法保证用户一定会在第一次申请的时候同意,所以一定是需要配合openSetting来使用的。 那我们在每个调用openSetting的地方都加一个button也是很别扭的。当下来说最好的处理方案就是把wx.authorize()和wx.openSetting()结合起来使用,并把他们放在一个bindtap/catchtap(或其他手势事件)的回调函数里。接下来我们重点来整合一下这种方式的权限处理。 ee383f2d12845929d024e8dca960d186.png 试炼场

接下来我们以获取微信的录音功能为例来具体分析一下权限使用流程。(需要注意的是一下我们的权限申请触发位置全部是在bindtap/catchtap[或其他手势事件]的回调函数里 )

1. 直接使用wx.startRecord(Object object)接口

startRecord(e) {
wx.startRecord({
success(res) {
console.log(res);
},
fail(err){
console.log(err);
}
})
},

执行该方法后会弹出一个对权限申请对话框

00e6f7528ccb3891d01394b0b5784781.png

如果此时点击了确定按钮,那我们可以顺利进行录音,并且之后再次调用该接口都无需授权直接进行录音,直到你在设置页面关闭该权限。但如果点击取消按钮,那之后我们再点击录音按钮将得不到任何响应,造成应用假死,用户如果遇到这种情况一定很抓狂。 那为了杜绝这种抓狂的情况出现,我们需要提前知道该权限的当前状态,以给用户一个完整的二次权限授权流程。

2. 结合wx.getSetting()和wx.openSetting()完善授权流程

我们先来单个看一下每个接口在各种情况下返回的数据。 ❶ wx.getSetting()
wx.getSetting({
success: function(res){
let scopeStatus = res.authSetting['scope.record'];
console.log('getSetting success, scope.record =', scopeStatus);
},

fail: function(err){
console.log('---- getSetting fail ', err);
}
})
用户未接受或拒绝过此权限:

getSetting success,scope.record = undefined

用户拒绝过此权限:

getSetting success,scope.record = false

用户同意过此权限:

getSetting success,scope.record = true

那我们开发人员就要根据这三种权限状态来进行二次授权或直接调用权限接口。 ❷ wx.openSetting() openSetting与getSetting类似,不过openSetting是打开设置页面,并在设置页退出的时候触发的回调函数,我们也来看一下它在用户不同的操作后会有怎么样的反馈。
wx.openSetting({
success: function(res) {
let scopeStatus = res.authSetting['scope.record'];
console.log('openSetting success, scope.record =', scopeStatus);
},

fail: function(err) {
console.log('---- openSetting fail ', err);
}
})
先 来看一下设置面板,下面三幅图分别是未进行过任何授权操作、拒绝录音功能授权、同意录用功能授权后的展示效果。 938db145d3ecd509838de43c528fa7d0.png 5ef5b06f2a6916b487fc8bddd84e0372.png 333383ce1897965e3514f52dc633c610.png

如果我们在设置面板中关闭录音授权,我们的回调结果是:

openSetting success,scope.record = false

如果我们在设置面板中打开录音授权,我们的回调结果是:

openSetting success,scope.record = true

如果用户在进行二次授权,那openSetting的回调监听将至关重要。我们需要根据拒绝和同意来进行不同的处理。

3. 过招

我们已经详细了解了权限申请过程中各个环节可能出现的状态值,也对用到的API进行了小试牛刀,面对权限我们要使出最有力度的组合拳,我们把wx.getSetting()、wx.openSetting()、wx.authorize() 结合起来,面对权限无论是首次申请还是二次申请或者以后的多次申请都会应对自如,接下来我们来看看这套组合拳的拳法:

 wx.getSetting({
success: function(res) {
let currentScope = res.authSetting[scope];
if (currentScope == undefined || currentScope == null) {
wx.authorize({
scope: scope,
success: function(res) {
authSuccess(res);
},
fail: function(err) {
authDeny();
}
});
} else if (currentScope == false) {
if (authDenied()) {
return;
}
wx.showModal({
title: '权限申请',
content: '点击 “确定” 按钮,打开 “' + authsName[scope] + '” 的权限设置界面',
cancelText: '取消',
confirmText: '确定',
success(res) {
if (res.confirm) {
wx.openSetting({
success: function(res) {
let cScope = res.authSetting[scope];
if (cScope) {
authSuccess();
} else {
authFail();
}
},
fail: function(res) {
authFail();
}
});
}
}
});
} else {
authSuccess();
}
},
fail: function() {
authFail();
}
});
ee383f2d12845929d024e8dca960d186.png 写在后面

本文主要针对开发者在权限使用时对权限的二次申请过程中可能会出现的几种操作路径以及各路径下对应的权限状态值做了一个简单介绍,然后通过分析我们整理出一个相对完善的权限处理流程,帮助开发者更有条理的应对权限申请。

以下是需要特别注意的几点:

  • 对于权限处理,开发者需要更加重视对二次授权的处理;
  • wx.openSetting()接口必须在组件的事件回调(bindtap/catchtap 或其他)函数中触发;
  • 需要对openSetting和getSetting返回的值对应的权限状态清楚了解;
  • 通过button申请权限无需开发者过多干预,只需处理权限获取成功或失败逻辑即可。

END

投稿有奖励ღ

官方邮箱

tech@eqxiu.com ae685ff8d474fe814401ca46a966c840.png

2b80054e9649ce2059afce60734c1f61.png

嗨,你“在看”吗? e994d655078986255ea7554bb925fbb9.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值