小程式沒有授權時的處理方法

SouthernBox發表於2017-06-24

在做小程式開發的時候,我們經常會需要獲取使用者的一些許可權。比如獲取使用者資訊用於直接登入,獲取地理位置用於定位等。但要是使用者拒絕授權了,該怎麼處理呢?

問題分析

在小程式裡面,獲取到使用者許可權是進行某些操作的必要前提。比如在進入小程式的時候,獲取到使用者資訊,拿到 unionId 對應到自己平臺的賬號進行登入,免去使用者自己輸入賬號密碼,這就是一個不錯的體驗。

當我們呼叫 wx.getUserInfo 或者 wx.getLocation 這種需要使用者授權的 API 時,小程式會彈框讓使用者選擇授權:

當使用者選擇允許後,下次再進入小程式就不會再詢問了,直接獲得使用者授權(除非將小程式刪了再進入)。這裡的問題在於,當使用者點了拒絕之後,就拿不到相關授權了,並且在一段時間內,進入小程式都不會再出現這個彈框。

從使用者體驗及保護隱私的角度考慮,小程式最好是不用授權也可以使用(或者體驗)。但有些型別的小程式確實是需要拿到使用者資訊才能使用的。這裡提供一個簡單的解決方案。

解決方案

以獲取使用者資訊直接登入為例。增加一個授權頁面,作為進入小程式的第一個頁面,在這裡獲取使用者資料和登入。預設可以什麼都不顯示,也可以當做引導頁來使用。

獲取使用者資訊需要用到 wx.login 和 wx.getUserInfo 兩個 API,關於這兩個 API 的具體資訊大家可以到官方文件去檢視。

增加一個登陸方法,程式碼如下:

//登入
login: function () {
  var that = this
  if (typeof success == "function") {
    this.data.getUserInfoSuccess = success
  }
  wx.login({
    success: function (res) {
      var code = res.code;
      wx.getUserInfo({
        success: function (res) {
          //平臺登入
        },
        fail: function (res) {
          that.setData({
            getUserInfoFail: true
          })
        }
      })
    }
  })
}複製程式碼

當上面程式碼走到了 fail 裡面,就可以認為在獲取授權的時候,使用者點了拒絕。當 getUserInfoFail 為 true 的時候,可以展示一個獲取授權的按鈕,比如像這樣:

接下來介紹另一個 API : wx.openSetting,使用 wx.openSetting 可以跳轉到小程式的授權設定介面,在安卓裡面它長這樣:

在點選授權按鈕後跳轉到這裡,讓使用者授權了才給進入首頁,否則就停留在授權頁面。

但還有個小問題,這個 API 是基礎庫 1.1.0 才有的,所以需要做相容處理:

所以,最終跳轉授權的程式碼如下:

//跳轉設定頁面授權
openSetting: function () {
  var that = this
  if (wx.openSetting) {
    wx.openSetting({
      success: function (res) {
        //嘗試再次登入
        that.login()
      }
    })
  } else {
    wx.showModal({
      title: '授權提示',
      content: '小程式需要您的微信授權才能使用哦~ 錯過授權頁面的處理方法:刪除小程式->重新搜尋進入->點選授權按鈕'
    })
  }
}複製程式碼

還好 1.1.0 已結算是比較早的版本了,現在都出到 1.3.0 了。

最終效果如下:

同樣的處理方式也可以用在獲取別的許可權上,妥妥的。

相關文章