【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: '您已拒绝授权获取位置信息'})}}} })