微信小程序自定義授權(quán)彈窗

做過疆偿、知道咱筛、了解微信小程序的都知道如果你的小程序應用需要獲取微信的用戶信息數(shù)據(jù)是需要通過用戶同意的搓幌,也就是需要用戶授權(quán),如果用戶不授權(quán)那么你就拿不到用戶的信息迅箩。很多人也都知道現(xiàn)在的人什么都可以不用帶溉愁,但手機不許要帶,因為手機就是我們的全部饲趋,無論是錢包拐揭,證件等等。所以安全和隱私就是一個比較敏感的話題了奕塑。

小程序這么做也是為了保護用戶的隱私數(shù)據(jù)堂污,早期開發(fā)小程序的都知道,小程序的授權(quán)在中途接口時大改了的龄砰,當時很多人吐槽盟猖,反正改和沒改都是一樣的,做任何事都會有人吐槽的换棚。

在我看來小程序的做法挺好式镐,畢竟用戶的隱私還是又用戶自己來做決定的,特別最近頭條和騰訊開發(fā)數(shù)據(jù)之間因為頭像等信息的事件固蚤,這種就更需要了娘汞。

今天就來看看如何去做一個小程序的授權(quán)封裝,這里封裝主要針對小程序應用必須要微信用戶數(shù)據(jù)的夕玩,所以也就是不授權(quán)就沒辦法用的你弦。

結(jié)構(gòu)搭建

首先需要我們在小程序組件目錄中添加一個授權(quán)的組件惊豺,基本結(jié)構(gòu)如下:


1.png

然后新建一個頁面用于組件的測試,如下:


2.png

上面的代碼json和wxml文件中沒有具體展示禽作,大家要記得引入組件以及在wxml中添加組件的標簽扮叨,如果不是很清楚可以看看微信小程序組件的使用。

組件的基本結(jié)構(gòu)

組件的界面主要是想模仿微信小程序自帶授權(quán)彈窗的樣式领迈,所以就按照這個樣式做一個彻磁,如下:

<view class='box' catchtouchmove='true'>
  <view class='pop'>
    <view class='top'>
      <view class='txt'></view>
      <view class='title'>微信授權(quán)</view>
      <view class='txt'>關(guān)閉</view>
    </view>
    <view class='center'>
      <view class='explain'><text>土家肸哥申請獲得以下權(quán)限:</text></view>
      <view class='tip'>
        <view class='dian'></view>
        <text>同意此應用訪問你的相機功能</text>
      </view>
    </view>
     <button class='bottom' open-type="openSetting">允許</button>
  </view>
</view>

上面的代碼有一個地方要注意就是允許這個按鈕,由于微信小程序后來接口調(diào)整必須要使用按鈕才能打開設置界面授權(quán)狸捅,而且小程序的授權(quán)api只在用戶第一次授權(quán)時才會彈窗詢問衷蜓,如果一旦拒絕授權(quán),那么后來就不能再調(diào)起授權(quán)彈窗界面了尘喝,所以頭疼的問題就在這里磁浇,明明官方有一個好的彈窗可以用,就是不給用朽褪,非要自己去寫一個置吓。沒辦法要用人家的東西,必須得遵守人家的規(guī)則缔赠,所以只能自己寫了衍锚。

組件的樣式
.box{
  width: 100vw;
  height: 100vh;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 999;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: 'PingFang SC';
  background-color: rgba(0, 0, 0, .4);
  
}
.box .pop{
  width: 621rpx;
  height: 522rpx;
  border-radius: 10rpx;
  background-color: rgb(248,247,249);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.box .pop .top{
  width: 100%;
  height: 94rpx;
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-bottom: 1rpx solid rgb(233,237,245);
}
.box .pop .top .txt{
  font-size: 28rpx;
  color: rgb(136,136,136);
  width: 128rpx;
  height: 93rpx;
  line-height: 93rpx;
  text-align: center;
}
.box .pop .top .title{
  font-size: 36rpx;
  font-weight: bold;
}

.box .pop .center{
  width: 100%;
  flex-grow: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.box .pop .center .duoduo{
  width: 71rpx;
  height: 71rpx;
  border-radius: 50%;
  margin-bottom: 32rpx;
}
.box .pop .center .duoduo image{
  width: 100%;
  height: 100%;
  border-radius: 50%;
}
.box .pop .center .explain{
  font-size: 32rpx;
  width: 520rpx;
  text-align: center;
  border-bottom: 1rpx solid rgb(233,237,245);
  padding-bottom: 32rpx;
}
.box .pop .center .tip{
  width: 520rpx;
  font-size: 28rpx;
  color: rgb(136,136,136);
  display: flex;
  align-items: center;
  margin-top: 32rpx;
  
}
.box .pop .center .tip .dian{
  width: 9rpx;
  height: 9rpx;
  background-color: rgb(136,136,136);
  border-radius: 50%;
  margin-left: 10rpx;
  margin-right: 22rpx;
}
.box .pop .bottom {
  width: 100%;
  height: 89rpx;
  line-height: 89rpx;
  text-align: center;
  border-top: 1rpx solid rgb(233,237,245);
  font-size: 32rpx;
  color: rgb(66,169,31);
}

有了樣式就可以看到長什么樣了,效果如下:


3.png

彈窗是寫好了嗤堰,我們的邏輯怎么寫呢戴质,根據(jù)上面提到的規(guī)則首先需要使用微信小程序自帶的授權(quán)api來讓用戶選擇,如果用戶拒絕才用自己寫的彈窗來提示用戶授權(quán)踢匣,其實這里會有一個問題就是當用戶點擊拒絕后有彈窗提示用戶授權(quán)告匠,這就是微信為什么這樣改的原因,老是給用戶彈窗离唬,所以建議大家在做小程序的時候設計一個游客狀態(tài)時微信最為提倡的后专。

組件邏輯

首先的用微信小程序自己的api來獲取用戶是否已經(jīng)授權(quán)了,代碼如下:

/**
     * 檢測用戶是否已經(jīng)授權(quán)過某個權(quán)限输莺,如果沒有授權(quán)就調(diào)用小程序的授權(quán)戚哎,如果授權(quán)了就返回相應的狀態(tài)給回調(diào)函數(shù)
     * scope為具體的某個權(quán)限
     * cb為回調(diào)
     */
    isAuthorize(scope, cb) {
      let self = this;
      wx.getSetting({
        success(res) {
          if (!res.authSetting['scope.' + scope]) {
            wx.authorize({
              scope: 'scope.' + scope,
              success() {
                return typeof cb == "function" && cb();
              },
              fail() {
                self.setAuthTxt(scope);
                self.callBack = cb;
                self.setData({
                  popShow: true
                })
              }
            })
          } else {
            return typeof cb == "function" && cb();
          }
        }
      })
    }

在組件的methods中添加上面的方法,這里主要是用的回調(diào)函數(shù)來處理授權(quán)成功多需要執(zhí)行的邏輯模闲。上面的代碼大家也可以看到如果授權(quán)失敗則會調(diào)用setAuthTxt這個函數(shù)建瘫,這里主要功能就是設置彈窗的一些提示信息,設置好后將回調(diào)保存尸折,最后顯示彈窗授啰脚。設置頁面提示信息很簡單就是設置data的值,如下:

setAuthTxt(authType) {
      var authTxt = '';
      switch (authType) {
        case 'userInfo':
          authTxt = '用戶信息';
          break;
        case 'userLocation':
          authTxt = '地理位置';
          break;
        case 'record':
          authTxt = '錄音功能';
          break;
        case 'writePhotosAlbum':
          authTxt = '保存到相冊';
          break;
        case 'camera':
          authTxt = '攝像頭';
          break;
      }
      this.setData({
        authType: authType,
        authTxt: authTxt
      })
    }

如果上面的內(nèi)容沒有你需要請求的權(quán)限的對應,請自行按照格式添加即可橄浓。

這里需要對頁面的結(jié)構(gòu)修改一下粒梦,主要添加一些事件來處理授權(quán)操作,如下:

+ <view class='box' catchtouchmove='true' wx:if='{{popShow}}'>
  <view class='pop'>
    <view class='top'>
      <view class='txt'></view>
      <view class='title'>微信授權(quán)</view>
+      <view class='txt' bindtap='popClose'>關(guān)閉</view>
    </view>
    <view class='center'>
      <view class='explain'><text>土家肸哥申請獲得以下權(quán)限:</text></view>
      <view class='tip'>
        <view class='dian'></view>
+        <text>同意此應用訪問你的{{authTxt}}功能</text>
      </view>
    </view>
+     <button class='bottom' open-type="openSetting" bindopensetting="getAuthorizeTool">允許</button>
  </view>
</view>

然后就是用戶點擊允許的邏輯了荸实,如下:

getAuthorizeTool: function(res) {
      var scope = 'scope.' + this.data.authType;
      if (res.detail.authSetting[scope]) {
        this.setData({
          popShow: false
        })
        return typeof this.callBack == "function" && this.callBack();
      }
    }

這里記得最后成功返回保存的回調(diào)告訴調(diào)用者授權(quán)成功了匀们,最后記得添加上關(guān)閉彈窗的事件處理函數(shù),如下:

popClose() {
      this.setData({
        popShow: false
      })
    }

到這里這個組件算是封裝好了准给,下面就看看如何使用這個封裝好的組件了泄朴。

授權(quán)組件的使用

組件的使用這里就不做過多介紹,大家可以看看官方文檔露氮,主要介紹封裝的組件的幾種情況祖灰。首先需要在json文件中引入組件,然后在wxml中添加組件標簽畔规,這里需要注意給標簽添加一個id方便后面調(diào)用事件局扶,如下:

<!--pages/auth/auth.wxml-->
<text>pages/auth/auth.wxml</text>
<auth id='authorization'></auth>

在調(diào)用的要么ready生命周期中獲取組件實例,如下:

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
   */
  onReady: function () {
    this.authorize = this.selectComponent("#authorization");
  },

最后就是調(diào)用了叁扫,這里分幾種情況調(diào)用三妈。

頁面級調(diào)用

這個其實就是如果某個頁面需要某些權(quán)限的,當然啦莫绣,這個組件目前只是簡單的功能所以這種情況即使用戶不授權(quán)頁面也已經(jīng)加載了畴蒲,所以適合有游客狀態(tài)的使用,如果沒有游客狀態(tài)的要么添加一個頁面要么自己加以改進兔综。調(diào)用方法如下:

  onReady: function () {
    this.authorize = this.selectComponent("#authorization");
    this.authorize.isAuthorize('record', () => {
      console.log('fffffffff')
    })
  },

其實就是在獲取到組件實例后調(diào)用即可

按鈕級調(diào)用

這種主要針對點擊某個按鈕的操作需要獲取某個權(quán)限才能進行的饿凛,如點擊按鈕錄制語音的狞玛,方法和上面的一樣软驰,只是具體調(diào)用的函數(shù)在不同地方而已,如下:

onReady: function () {
    this.authorize = this.selectComponent("#authorization");
  },
  /**
   * 處理錄制按鈕的點擊事件
   */
  handleRecordButton(){
    this.authorize.isAuthorize('record', () => {
      console.log('fffffffff')
    })
  },

主要的調(diào)用就這兩種心肪。

調(diào)用效果

調(diào)用組件后的效果風三種情況锭亏。

只觸發(fā)小程序自帶授權(quán)

這種情況就是用戶在初次使用時調(diào)用的是微信小程序自帶的授權(quán)彈窗,而且用戶馬上就是授權(quán)了硬鞍,這種情況的效果如下:


4.gif

上面的動圖中大家可以看到授權(quán)之后調(diào)試器就會打印出來了慧瘤,說明授權(quán)成功了。

拒絕授權(quán)觸發(fā)自定義彈窗

當用戶拒絕授權(quán)后就可以彈窗我們自定義的彈窗了固该,在自定義彈窗中可以選擇允許或者不處理锅减。這里主要是自定義彈窗后允許的情況。效果如下:


5.gif
用戶拒絕自定義授權(quán)

如果上面異步用戶選擇了關(guān)閉伐坏,那么回調(diào)就不會執(zhí)行了怔匣,和上面提到的頁面級一樣了,效果如下:


6.gif

到此這個授權(quán)組件就已經(jīng)封裝查不到了桦沉,如果有什么錯誤或者不足希望大家提出每瞒,共同學習金闽,交流!
也可以加我的vx:w_loading
謝謝大家剿骨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末代芜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浓利,更是在濱河造成了極大的恐慌挤庇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贷掖,死亡現(xiàn)場離奇詭異罚随,居然都是意外死亡,警方通過查閱死者的電腦和手機羽资,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屠升,“玉大人潮改,你說我怎么就攤上這事「古” “怎么了汇在?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脏答。 經(jīng)常有香客問我糕殉,道長,這世上最難降的妖魔是什么殖告? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任阿蝶,我火速辦了婚禮,結(jié)果婚禮上黄绩,老公的妹妹穿的比我還像新娘羡洁。我一直安慰自己,他們只是感情好爽丹,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布筑煮。 她就那樣靜靜地躺著,像睡著了一般粤蝎。 火紅的嫁衣襯著肌膚如雪真仲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天初澎,我揣著相機與錄音秸应,去河邊找鬼。 笑死,一個胖子當著我的面吹牛灸眼,可吹牛的內(nèi)容都是我干的卧檐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼焰宣,長吁一口氣:“原來是場噩夢啊……” “哼霉囚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匕积,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盈罐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闪唆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盅粪,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年悄蕾,在試婚紗的時候發(fā)現(xiàn)自己被綠了票顾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡帆调,死狀恐怖奠骄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情番刊,我是刑警寧澤含鳞,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站芹务,受9級特大地震影響蝉绷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枣抱,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一熔吗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沃但,春花似錦磁滚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽维雇。三九已至淤刃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吱型,已是汗流浹背逸贾。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铝侵。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓灼伤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咪鲜。 傳聞我的和親對象是個殘疾皇子狐赡,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

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