【1】問題描述:
- 小程序在調用
wx.getLocation()
獲取用地理位置時,如果用戶選擇拒絕授權,代碼會直接拋出錯誤。如果再次調用wx.getLocation()
時,就不會在彈窗詢問用戶是否允許授權。導致用戶想要重新允許獲取地理位置時,沒有途徑。
【2】前提準備:
- 小程序已經 申請過
wx.getLocation()
:獲取當前的地理位置 的服務權限 - 在小程序的根目錄下的 app.json 中配置
requiredPrivateInfos
進行聲明啟用- 在調用
wx.getLocation()
時需要在 app.json 配置permission
字段,同時使用scope.userLocation
聲明收集用戶選擇的位置信息的目(wx.chooseLocation()
接口不需要配置該字段,可以直接進行調用)
{"requiredPrivateInfos": ["getLocation"],"permission": {"scope.userLocation": {"desc": "獲取用戶位置信息用于填寫收貨地址"}} }
- 在調用
【3】解決思路:
-
與直接調用
wx.getLocation()
不同, 我們需要優化授權的流程:- 用戶進入到需要授權地理位置的頁面,首先使用
wx.getSetting()
獲取用戶所有的授權信息,查詢是否已經授權地理位置信息。wx.getSetting()
返回一個 authSetting 對象,對象只會包含小程序已經向用戶請求過的權限,以及授權結果。 - 在 authSetting 對象 中,
authsetting['scope.userLocation']
的返回值表示是否已經授權獲取地理位置的信息:- 返回 true:用戶之前已經允許小程序獲取用戶的地理位置信息,直接用 wx.getLocation() 獲取用戶位置信息即可
- 返回 false:用戶已經拒絕授權訪問地理位置信息
- 返回 undefined:用戶即沒有同意也沒有拒絕,可以用 wx.getLocation() 方法,微信小程序將會顯示彈框,詢問用戶是否允許小程序獲取地理位置
- 如果用戶之前已經拒絕獲取地理位置信息,現在小程序需要該信息時,可以使用
wx.showModal()
彈出一個彈框,詢問用戶是否進行授權 - 當用戶允許授權是,通過
wx.openSetting()
調起微信客戶端小程序設置界面,用戶可以進行設置權限。
- 用戶進入到需要授權地理位置的頁面,首先使用
注意事項:
- 如果希望用戶再次授權,就需要讓用戶進行 手動開啟授權。
- wx.openSetting() 必須用戶發生點擊行為后,才可以跳轉到設置頁進行授權信息管理。
【4】代碼:
-
index.wxml
<button type="primary" bind:tap="getUserPosition">獲取用戶地理位置信息</button>
-
index.js
// index.js Page({async getUserPosition() {const { authSetting } = await wx.getSetting()if (authSetting['scope.userLocation'] === false) {// 用戶之前已經拒絕授權,現在希望能夠再次授權// 使用對話框提示用戶進行授權wx.showModal({title: '授權提示',content: '需要獲取地理位置信息,請確認授權',complete: async ({ confirm, cancel }) => {if (confirm) {const {authSetting} = await wx.openSetting()// 用戶再次拒絕授權if (!authSetting['scope.userLocation']) {wx.showToast({icon: 'none',title: '授權失敗'})return}// 已經允許獲取位置信息const res = await wx.getLocation()console.log(res);} else {wx.showToast({icon: 'none',title: '您已拒絕授權'})}},})} else {try {const res = await wx.getLocation()console.log(res);} catch (error) {console.log(error);wx.showToast({icon: 'none',title: '您已拒絕授權獲取位置信息'})}}} })