微信小程序之權(quán)限篇講解

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è)面.png

我們看這段代碼,頁(yè)面上有2個(gè)按鈕特幔,1個(gè)是打開(kāi)設(shè)置頁(yè)咨演,1個(gè)是獲取用戶信息。然后在onshow()方法中獲取發(fā)微信票抬頭淹禾,保存并清除掉所有權(quán)限宾抓,然后啟用真機(jī)調(diào)試句惯!

首先頁(yè)面加載好就是一個(gè)授權(quán)彈框提示:


發(fā)票抬頭授權(quán).png

我們選擇拒絕,然后查看打印的數(shù)據(jù):


發(fā)票抬頭_日志.png

然后切到其他頁(yè)面再切回來(lái)遭赂,查看打印的數(shù)據(jù):


發(fā)票抬頭_日志2.png

再多試幾次,還是同樣的結(jié)果横辆。同樣的嵌牺,你清除掉緩存,再次調(diào)試龄糊,選擇同意授權(quán)逆粹,此時(shí)會(huì)進(jìn)入獲取發(fā)票抬頭的頁(yè)面,如下:


發(fā)票抬頭_具體.jpg

然后每次切換頁(yè)面再回來(lái)炫惩,你會(huì)發(fā)現(xiàn)已經(jīng)不用再?gòu)棾龃翱诰涂梢垣@取發(fā)票抬頭了僻弹。

然后點(diǎn)擊獲取用戶信息的按鈕,彈出授權(quán)窗口(不知道你注意沒(méi)他嚷,右邊的按鈕是允許蹋绽,但左邊的按鈕叫取消,而不是拒絕筋蓖!

用戶信息.png

然后點(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é)果如下:


微信圖片_20190525164225.png

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)了。

它們的效果是一樣令野,如下圖:

wx.openSetting()調(diào)用效果.png

并且在成功回調(diào)中舀患,都返回有最新的所有權(quán)限的授權(quán)數(shù)據(jù)。

如气破,wx.openSetting()中success回調(diào)方法中打印的數(shù)據(jù):

wx.openSetting()的success回調(diào)打印數(shù)據(jù).png

如聊浅,<button open-ype="openSetting" bindopenSetting="openS2">打開(kāi)設(shè)置頁(yè)2</button>的成功回調(diào)方法打印數(shù)據(jù)

button的open-type='openSetting'的成功回調(diào).png

它們的代碼如下:

<!-- 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)限啥的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末非竿,一起剝皮案震驚了整個(gè)濱河市蜕着,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌红柱,老刑警劉巖承匣,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锤悄,居然都是意外死亡韧骗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)零聚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袍暴,“玉大人,你說(shuō)我怎么就攤上這事隶症≌#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蚂会,是天一觀的道長(zhǎng)淋样。 經(jīng)常有香客問(wèn)我,道長(zhǎng)颂龙,這世上最難降的妖魔是什么习蓬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任纽什,我火速辦了婚禮措嵌,結(jié)果婚禮上躲叼,老公的妹妹穿的比我還像新娘。我一直安慰自己企巢,他們只是感情好枫慷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著浪规,像睡著了一般或听。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笋婿,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天誉裆,我揣著相機(jī)與錄音,去河邊找鬼缸濒。 笑死足丢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庇配。 我是一名探鬼主播斩跌,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捞慌!你這毒婦竟也來(lái)了耀鸦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啸澡,失蹤者是張志新(化名)和其女友劉穎袖订,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嗅虏,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡著角,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旋恼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吏口。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冰更,靈堂內(nèi)的尸體忽然破棺而出产徊,到底是詐尸還是另有隱情,我是刑警寧澤蜀细,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布舟铜,位于F島的核電站,受9級(jí)特大地震影響奠衔,放射性物質(zhì)發(fā)生泄漏谆刨。R本人自食惡果不足惜塘娶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痊夭。 院中可真熱鬧刁岸,春花似錦、人聲如沸她我。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)番舆。三九已至酝碳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恨狈,已是汗流浹背疏哗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禾怠,地道東北人返奉。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刃宵,于是被迫代替她去往敵國(guó)和親衡瓶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容