0贸辈、前言
一直以來(lái)泪姨,小程序的授權(quán)都是極其靈活(混亂的(小聲bb))凸椿,加之文檔又沒(méi)寫(xiě)明白削祈,所以今天來(lái)捋一捋。
小程序調(diào)起授權(quán)的方式有3種:
一是直接使用相關(guān)api時(shí)自動(dòng)調(diào)起,例如調(diào)用wx.chooseAddress()髓抑,只要你之前沒(méi)有授權(quán)或拒絕過(guò)咙崎,就會(huì)出現(xiàn)允許調(diào)用通訊地址授權(quán)窗口;
二是使用預(yù)授權(quán),像下方代碼也可以調(diào)起對(duì)應(yīng)的授權(quán)窗口吨拍;
wx.authorize({
scope: 'scope.invoiceTitle',
success:function(res){
console.log('發(fā)票抬頭授權(quán)成功');
},
fail:function(err){
console.log('發(fā)票抬頭授權(quán)失敗');
},
complete:function(){
console.log('complete')
}
})
三是組件方式褪猛,例如使用button按鈕,像獲取用戶數(shù)據(jù)羹饰,手機(jī)號(hào)等伊滋;
除此之外,用button觸發(fā)的授權(quán)方式可以無(wú)限調(diào)起授權(quán)窗口(只要之前沒(méi)成功就能無(wú)限調(diào)起)队秩,而用api觸發(fā)的只能調(diào)起一次(無(wú)論成功或失斝ν)
再除此之外,小程序還有wx.getSetting()馍资,可以獲取到已申請(qǐng)的所有的權(quán)限的授權(quán)結(jié)果(通過(guò)對(duì)應(yīng)的字段的true或false來(lái)標(biāo)識(shí))
再再除此之外筒主,本來(lái)由于api觸發(fā)只能調(diào)起一次授權(quán)窗口,那么利用wx.getSetting()獲取到用戶已拒絕的情況下鸟蟹,還可以利用跳轉(zhuǎn)設(shè)置頁(yè)(wx.openSetting())的方式引導(dǎo)用戶重新打開(kāi)授權(quán)乌妙。但...這個(gè)跳轉(zhuǎn)設(shè)置頁(yè)的api又被封了(2.3.0之后不能用)...,后面只能通過(guò)button的方式來(lái)跳轉(zhuǎn)設(shè)置頁(yè)...
1建钥、小程序開(kāi)放的授權(quán)
小程序官方將授權(quán)劃分為了以下幾種藤韵。
scope | 對(duì)應(yīng)接口 | 描述 |
---|---|---|
scope.userInfo | wx.getUserInfo(已廢棄) | 用戶信息 |
scope.userLocation | wx.getLocation, wx.chooseLocation | 地理位置 |
scope.address | wx.chooseAddress | 通訊地址 |
scope.invoiceTitle | wx.chooseInvoiceTitle | 發(fā)票抬頭 |
scope.invoice | wx.chooseInvoice | 獲取發(fā)票 |
scope.werun | wx.getWeRunData | 微信運(yùn)動(dòng)步數(shù) |
scope.record | wx.startRecord | 錄音功能 |
scope.writePhotosAlbum | wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum | 保存到相冊(cè) |
scope.camera | <camera /> 組件 | 攝像頭 |
眼尖的話,你可能還發(fā)現(xiàn)熊经,用戶手機(jī)號(hào)沒(méi)有在里面泽艘。因?yàn)槭謾C(jī)號(hào)未對(duì)個(gè)人開(kāi)發(fā)者開(kāi)放,所以這里沒(méi)有把它列出來(lái)奈搜。(測(cè)不到)
2悉盆、授權(quán)觸發(fā)方式
上文表格中列舉了我們?nèi)粘i_(kāi)發(fā)中所能夠用到的權(quán)限盯荤,但是因?yàn)楂@取用戶userInfo和其他的不同馋吗,所以我們還需要將它們?cè)俅芜M(jìn)行劃分分類,劃分依據(jù)就是 授權(quán)觸發(fā)方式秋秤!
根據(jù)授權(quán)觸發(fā)方式宏粤,我們可以將上面的權(quán)限再次劃分為 手動(dòng)觸發(fā) 和 api觸發(fā)。
手動(dòng)觸發(fā):
scope.userInfo
api觸發(fā):
除了scope.userInfo 之外的權(quán)限
手動(dòng)觸發(fā)和api觸發(fā)有什么不同灼卢?
先拋結(jié)論:
1绍哎、api觸發(fā)的,授權(quán)窗口只彈出一次鞋真;手動(dòng)觸發(fā)的崇堰,授權(quán)窗口可以彈出無(wú)限次(只要沒(méi)允許授權(quán)之前每次點(diǎn)擊都會(huì)觸發(fā))
2、api觸發(fā)的,可以預(yù)授權(quán)海诲。
3繁莹、示例(獲取發(fā)票抬頭和用戶信息)
首先有這么以下一段代碼:
<!-- wxml -->
<button open-type="openSetting" bindopensetting="callback">打開(kāi)設(shè)置頁(yè)</button>
<button open-type="getUserInfo" bindgetuserinfo='getInfo'>獲取用戶信息</button>
// js
getInfo(res){
console.log(res)
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面顯示
*/
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('發(fā)票抬頭授權(quán)成功');
// },
// fail:function(err){
// console.log('發(fā)票抬頭授權(quán)失敗');
// },
// complete:function(){
// console.log('complete')
// }
// })
},
onHide: function () {
console.log('頁(yè)面onhide')
},
頁(yè)面展示如下:
我們看這段代碼,頁(yè)面上有2個(gè)按鈕特幔,1個(gè)是打開(kāi)設(shè)置頁(yè)咨演,1個(gè)是獲取用戶信息。然后在onshow()方法中獲取發(fā)微信票抬頭淹禾,保存并清除掉所有權(quán)限宾抓,然后啟用真機(jī)調(diào)試句惯!
首先頁(yè)面加載好就是一個(gè)授權(quán)彈框提示:
我們選擇拒絕,然后查看打印的數(shù)據(jù):
然后切到其他頁(yè)面再切回來(lái)遭赂,查看打印的數(shù)據(jù):
再多試幾次,還是同樣的結(jié)果横辆。同樣的嵌牺,你清除掉緩存,再次調(diào)試龄糊,選擇同意授權(quán)逆粹,此時(shí)會(huì)進(jìn)入獲取發(fā)票抬頭的頁(yè)面,如下:
然后每次切換頁(yè)面再回來(lái)炫惩,你會(huì)發(fā)現(xiàn)已經(jīng)不用再?gòu)棾龃翱诰涂梢垣@取發(fā)票抬頭了僻弹。
然后點(diǎn)擊獲取用戶信息的按鈕,彈出授權(quán)窗口(不知道你注意沒(méi)他嚷,右邊的按鈕是允許蹋绽,但左邊的按鈕叫取消,而不是拒絕筋蓖!)
然后點(diǎn)取消卸耘,再點(diǎn)獲取用戶信息的按鈕,又會(huì)彈出來(lái)粘咖。你可以多試幾次蚣抗,然后點(diǎn)允許之后,之后再點(diǎn)就沒(méi)有彈窗了瓮下。
從以上現(xiàn)象我們可以得出這么一個(gè)結(jié)論:
api觸發(fā)授權(quán)窗口,無(wú)論成功或者失敗讽坏,授權(quán)窗口只彈出一次迷捧!而手動(dòng)觸發(fā)的授權(quán)窗口漠秋,只要之前沒(méi)成功就會(huì)一直彈出手趣!
4绿渣、預(yù)授權(quán)(wx.authorize())
然后我們改造一下上面的代碼,如下:
<!-- wxml -->
<button open-type="openSetting" bindopensetting="callback">打開(kāi)設(shè)置頁(yè)</button>
<button open-type="getUserInfo" bindgetuserinfo='getInfo'>獲取用戶信息</button>
<button bindtap='getInvoiceTitle'>獲取發(fā)票抬頭</button>
//js
onShow: function () {
console.log('onshow');
wx.authorize({
scope: 'scope.invoiceTitle',
success:function(res){
console.log('發(fā)票抬頭授權(quán)成功');
},
fail:function(err){
console.log('發(fā)票抬頭授權(quán)失敗');
},
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()方法進(jìn)行了預(yù)授權(quán),將授權(quán)和獲取發(fā)票分開(kāi)郭膛。
同樣的,授權(quán)窗口也是只彈出一次,無(wú)論你選擇了允許還是拒絕己肮。
并且由于窖剑,wx.getUserInfo()的廢棄讶舰,所以獲取用戶信息無(wú)法進(jìn)行預(yù)授權(quán)般甲。
所以,使用api方式觸發(fā)授權(quán)的權(quán)限锚烦,可以進(jìn)行預(yù)授權(quán)帝雇,手動(dòng)觸發(fā)授權(quán)的權(quán)限無(wú)法進(jìn)行預(yù)授權(quán)涮俄。
5、wx.getSetting()
wx.getSetting()只有一個(gè)作用尸闸,那就是查看你申請(qǐng)過(guò)的所有權(quán)限的授權(quán)結(jié)果彻亲,結(jié)果是一個(gè)true 或者 false!
例如我的小程序中吮廉,有允許過(guò) 用戶信息苞尝,拒絕了發(fā)票抬頭。在button中調(diào)用wx.getting()宦芦,
<!-- wxml -->
<button bindtap='getAuthSetting'>獲取授權(quán)數(shù)據(jù)</button>
// js
getAuthSetting(){
wx.getSetting({
success: function (res) {
console.log(res)
// 查看具體某個(gè)權(quán)限的授權(quán)方式是用以下方法野来,而不能用res.authSetting.scope.userInfo
console.log(res.authSetting['scope.userInfo'])
},
fail: function (err) {
console.log(err)
},
complete: function () {
console.log('complete')
}
})
},
最后打印結(jié)果如下:
6、打開(kāi)設(shè)置頁(yè)(wx.openSetting()或者是 <button open-type='openSetting'>打開(kāi)設(shè)置頁(yè)</button>)
2.3.0版本之前踪旷,可以通過(guò)wx.openSetting()來(lái)引導(dǎo)用戶重新授權(quán)曼氛,2.3.0之后只能通過(guò)Button的方式來(lái)引導(dǎo)了。
它們的效果是一樣令野,如下圖:
并且在成功回調(diào)中舀患,都返回有最新的所有權(quán)限的授權(quán)數(shù)據(jù)。
如气破,wx.openSetting()中success回調(diào)方法中打印的數(shù)據(jù):
如聊浅,<button open-ype="openSetting" bindopenSetting="openS2">打開(kāi)設(shè)置頁(yè)2</button>的成功回調(diào)方法打印數(shù)據(jù)
它們的代碼如下:
<!-- wxml -->
<button bindtap='openS'>打開(kāi)設(shè)置頁(yè)1</button>
<button open-type='openSetting' bindopensetting='openS2'>打開(kāi)設(shè)置頁(yè)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、總結(jié)
在本篇文章中现使,我們按照授權(quán)觸發(fā)方式低匙,簡(jiǎn)單地將它們分為2部分,1是api觸發(fā)碳锈,2是button觸發(fā)(通過(guò)open-type)顽冶。
1、api觸發(fā)的
可以通過(guò)預(yù)授權(quán)觸發(fā)授權(quán)彈窗或者是到調(diào)用的時(shí)候由系統(tǒng)觸發(fā)彈窗售碳,但要注意的是强重,通過(guò)api觸發(fā)的绞呈,只能觸發(fā)一次授權(quán)彈窗(無(wú)論成功或失敗)间景,需要做好相關(guān)的兼容(如wx.getSetting() 查看授權(quán)數(shù)據(jù)和wx.openSetting()/ button open-type=openSetting打開(kāi)設(shè)置頁(yè)引導(dǎo)用戶重新授權(quán)等)佃声。
2、通過(guò)button觸發(fā)的授權(quán)(如用戶信息倘要,手機(jī)號(hào)等)圾亏,由于可以無(wú)限觸發(fā)授權(quán)窗口(授權(quán)未成功之前),因此來(lái)說(shuō)封拧,兼容問(wèn)題要少一點(diǎn)召嘶。
一般來(lái)說(shuō),如果需要的權(quán)限少哮缺,可以在啟動(dòng)時(shí)采用預(yù)授權(quán)弄跌,然后在對(duì)應(yīng)頁(yè)面做好兼容判斷等;如果需要的權(quán)限多的話尝苇,建議在各個(gè)模塊的時(shí)候再授權(quán)(或者是用到的時(shí)候直接調(diào)用铛只,讓系統(tǒng)調(diào)起授權(quán)窗口),這樣的話用戶就不至于覺(jué)得糠溜,這什么東西淳玩,怎么要那么多權(quán)限啥的。