原文連結:https://devework.com/weixin-w…,轉載請明鏈的方式給出來源,謝謝!
微信小程式中提供了相關API 讓開發者能獲取到微信使用者的相關資訊,在首次去獲取的時候會展示一個使用者是否同意授權的對話方塊。Jeff 發現有不少線上的小程式都沒有處理好使用者“拒絕授權”導致的“授權失敗”場景。<span></span>
一個觀點
私認為,開發微信小程式在使用者授權上有一個要點:除非非常有必要,不要一進入小程式就申請授權,而是僅需要授權的頁面才申請——這樣讓使用者的心理負擔沒那麼大。站在使用者的角度,有時候我是很討厭這種一進入小程式就申請授權的行為,畢竟頭像暱稱這些本質上還是屬於使用者的隱私,你小程式不給個理由就要拿去,我還是很反感的。同時,也應該做好因使用者拒絕授權導致的“授權失敗”場景的優雅處理。
分享解決方案
現在就分享我在開發自己的微信小程式“DeveWork+”中針對“授權失敗”場景的一種自認為還算優雅的處理方案。如果你有興趣,可以通過下面的小程式碼進入體驗一下其使用者授權流程。
“DeveWork+”小程式有一個閱讀記錄頁面,用來記錄當前使用使用者瀏覽文章的歷史。下面是處理方案細節:
1)閱讀記錄頁面我是放在第三個TAB,使用者首次進入及載入首頁的過程並無申請授權的相關程式碼。
2)當使用者首次點選到閱讀記錄頁面,如下圖,除了彈出常規的使用者授權對話方塊,使用者也能看到“閱讀記錄僅儲存在裝置…”這段文字,消除一些忌諱資料被遠端保留的使用者的心理負擔。
3)使用者點選同意授權固然好,但如果是拒絕授權,會彈出一個提示予以詳細說明授權的必要性(如下圖):
4)使用者只有點選“確定”的選擇,點選後會跳轉到使用者資訊設定頁面,需要手動勾選(如下圖)。如果此時使用者依然拒絕,後續只要切換到閱讀記錄頁面,均會一直彈上圖的對話方塊。
具體實現
微信小程式在基礎庫1.2 版本中提供了wx.getSetting
這個介面可以獲取到使用者的當前設定。利用這個介面我們就可以進行二次判斷使用者的授權狀態,如果回撥失敗,則可以彈對話方塊說明並通過wx.openSetting
這個介面進入到設定頁面。
以下是“DeveWork+”的實現程式碼:
1)首先在util.js
中加入一段用來判斷是否為空物件的函式。這個函式在後面wx.getSetting
中可以用來判斷使用者是否是第一次授權。
// https://devework.com/weixin-weapp-auth-failed.html
// 是否為空物件
function isEmptyObject(e) {
var t;
for (t in e)
return !1;
return !0
}
2)在需要授權的頁面的onload
生命週期中新增常規的獲取使用者資訊程式碼(此程式碼與官方的quickstart 一致,不全部重複)。
// https://devework.com/weixin-weapp-auth-failed.html
var that = this;
//呼叫應用例項的方法獲取全域性資料
this.getUserInfo(function (userInfo) {
//更新使用者資料
that.setData({
userInfo: userInfo
})
});
3)另外新建一個checkSettingStatu
函式來檢測使用者授權狀態。
// https://devework.com/weixin-weapp-auth-failed.html
// 檢測授權狀態
checkSettingStatu: function(cb) {
var that = this;
// 判斷是否是第一次授權,非第一次授權且授權失敗則進行提醒
wx.getSetting({
success: function success(res) {
console.log(res.authSetting);
var authSetting = res.authSetting;
if (util.isEmptyObject(authSetting)) {
console.log(`首次授權`);
} else {
console.log(`不是第一次授權`, authSetting);
// 沒有授權的提醒
if (authSetting[`scope.userInfo`] === false) {
wx.showModal({
title: `使用者未授權`,
content: `如需正常使用閱讀記錄功能,請按確定並在授權管理中選中“使用者資訊”,然後點按確定。最後再重新進入小程式即可正常使用。`,
showCancel: false,
success: function (res) {
if (res.confirm) {
console.log(`使用者點選確定`)
wx.openSetting({
success: function success(res) {
console.log(`openSetting success`, res.authSetting);
}
});
}
}
})
}
}
}
});
}
PS: 如果你覺得這段程式碼層層回撥有點噁心,可自行引入Promise 來改寫程式碼。
4)checkSettingStatu
函式繫結到onShow 生命週期,這樣在“授權失敗”場景下一進入頁面就提醒。
// https://devework.com/weixin-weapp-auth-failed.html
onShow: function(){
this.checkSettingStatu();
}
文末
以上就是Jeff 的一個解決方案,本文僅拋磚引玉,如果你覺得有更好的,不妨也告訴我~
本站“微信小程式”系列文章:https://devework.com/tag/weapp