問題:
在首次進入小程序時,我們常常會收到一些獲取權限的申請,比如「獲取地理位置權限」、需要微信登錄時請求「獲得你的公開信息(昵稱、頭像等)」。對於這些權限申請,開發者當然希望獲得所有權限,而用戶拒絕授權的情況不免存在。那么作為開發人員在考慮「用戶拒絕授權」這類異常情況出現時,應該提前做好未獲得授權時的兼容處理,以及用戶希望授權時的再次提醒。
查看官方文檔:
授權
部分接口需要經過用戶授權同意才能調用。我們把這些接口按使用范圍分成多個scope,用戶選擇對 scope來進行授權,當授權給一個scope之后,其對應的所有接口都可以直接使用。此類接口調用時:
- 如果用戶未接受或拒絕過此權限,會彈窗詢問用戶,用戶點擊同意后方可調用接口;
- 如果用戶已授權,可以直接調用接口;
- 如果用戶已拒絕授權,則不會出現彈窗,而是直接進入接口 fail 回調。請開發者兼容用戶拒絕授權的場景。
......
授權有效期
一旦用戶明確同意或拒絕過授權,其授權關系會記錄在后台,直到用戶主動刪除小程序。
最佳實踐
在真正需要使用授權接口時,才向用戶發起授權申請,並在授權申請中說明清楚要使用該功能的理由。
分析:
官方文檔,並沒有給出明顯的說明和解決示例,但是我們還是可以通過上面這句話得到解決方式,當用戶拒絕授權后調用授權彈窗接口 wx.authorize,不會再次出現彈窗,但是會進入接口的fail回調,那我們就可以在fail回調里想辦法再次進行授權操作,肯定不能調用 wx.authorize,那應該怎么辦呢?通過查資料我們發現,微信小程序其實是有一個設置功能界面的,在設置界面里面我們可以對小程序進行再次授權。然而,通過官方文檔我們可以知道,有一個API可以實現打開設置界面的功能,就是wx.openSetting,可以調起客戶端小程序設置界面,返回用戶設置的操作結果。但是設置界面只會出現小程序已經向用戶請求過的權限,我們可以按照這個思路解決問題。
示例代碼:
// 可以通過 wx.getSetting 先查詢一下用戶是否授權了 "scope.record" 這個 scope
wx.getSetting({
success(res) {
console.log(!res.authSetting['scope.userLocation']);
if (!res.authSetting['scope.userLocation']) {
wx.authorize({
scope: 'scope.userLocation',
success() {
// 用戶已經同意
//其他操作...
console.log("用戶已經同意位置授權");
},
fail(){
console.log("用戶已經拒絕位置授權");
that.openConfirm();//如果拒絕,在這里進行再次獲取授權的操作
}
})
}
//其他操作..
}
});
//再次獲取授權
//當用戶第一次拒絕后再次請求授權
openConfirm: function () {
wx.showModal({
content: '檢測到您沒打開此小程序的定位權限,是否去設置打開?',
confirmText: "確認",
cancelText: "取消",
success: function (res) {
console.log(res);
//點擊“確認”時打開設置頁面
if (res.confirm) {
console.log('用戶點擊確認')
wx.openSetting({
success: (res) => { }
})
} else {
console.log('用戶點擊取消')
}
}
});
}