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
然后每次切换页面再回来,你会发现已经不用再弹出窗口就可以获取发票抬头了。
然后点击获取用户信息的按钮,弹出授权窗口(不知道你注意没,右边的按钮是允许,但左边的按钮叫取消,而不是拒绝!)
然后点取消,再点获取用户信息的按钮,又会弹出来。你可以多试几次,然后点允许之后,之后再点就没有弹窗了。
从以上现象我们可以得出这么一个结论:
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回调方法中打印的数据:
如,<button open-ype="openSetting" bindopenSetting="openS2">打开设置页2</button>的成功回调方法打印数据
它们的代码如下:
<!-- 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触发的授权(如用户信息,手机号等),由于可以无限触发授权窗口(授权未成功之前),因此来说,兼容问题要少一点。
一般来说,如果需要的权限少,可以在启动时采用预授权,然后在对应页面做好兼容判断等;如果需要的权限多的话,建议在各个模块的时候再授权(或者是用到的时候直接调用,让系统调起授权窗口),这样的话用户就不至于觉得,这什么东西,怎么要那么多权限啥的。
网友评论