問題:
在首次進入小程序時,我們常常會收到一些獲取權限的申請,比如「獲取地理位置權限」、需要微信登錄時請求「獲得你的公開信息(昵稱、頭像等)」。對於這些權限申請,開發者當然希望獲得所有權限,而用戶拒絕授權的情況不免存在。那么作為開發人員在考慮「用戶拒絕授權」這類異常情況出現時,應該提前做好未獲得授權時的兼容處理,以及用戶希望授權時的再次提醒。
查看官方文檔:
授權
部分接口需要經過用戶授權同意才能調用。我們把這些接口按使用范圍分成多個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('用戶點擊取消') } } }); }