在开发的过程中,我们会发现一个问题:
在调用 wx.getLocation()
获取用地理位置时,如果用户选择拒绝授权,代码会直接抛出错误。在拒绝授权以后,再次调用 wx.getLocation()
时,就不会在弹窗询问用户是否允许授权。
所以我们就得需要优化下整个授权的流程:
wx.getSetting()
:获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。wx.openSetting()
: 调起客户端小程序设置界面,返回用户设置的操作结果。
注意
- 如果希望用户再次授权,就需要让用户进行 手动开启授权。
- wx.openSetting() 必须用户发生点击行为后,才可以跳转到设置页进行授权信息管理。
整个代码如下:
// 获取用户地理位置信息
async onLocation() {
// 调用 getSetting 方法获取用户所有的授权信息
// 返回的 authSetting 包含小程序已向小程序申请过的权限已经授权结果(true、false)
const { authSetting } = await wx.getSetting()
console.log(authSetting)
// scope.userLocation 是否已经授权获取地理位置的信息
// 如果之前没有申请过返回 undefined,需要调用 getLocation
// 如果之前同意了授权,返回 true,需要调用 getLocation
// 如果之前拒绝了授权,返回 false,需要用户手动进行授权
// 等于 true,或者不等于 undefined,说明需要进行授权
// const isAuth =
// authSetting['scope.userLocation'] ||
// authSetting['scope.userLocation'] === undefined
// 为了避免冗余的条件判断,使用 !! 把代码进行优化
const isAuth = !!authSetting['scope.userLocation']
if (!isAuth) {
// 弹窗询问用户是否进行授权
const modalRes = await wx.modal({
title: '授权提示',
content: '需要需要您的地理位置信息,请确认授权'
})
// 如果用户点击了取消,说明用户拒绝了授权,给用户提示
if (!modalRes) return wx.toast({ title: '您拒绝了授权' })
// 如果用户点击了确定,调用 wx.openSetting 打开微信客户端小程序授权页面
// 并返回授权以后的结果
const { authSetting } = await wx.openSetting()
// 如果用户没有更新授权信息,提示没有更新授权
if (!authSetting['scope.userLocation'])
return wx.toast({ title: '授权失败!' })
try {
// 如果用户更新授权信息,则调用 getLocation 获取用户地理位置信息
const locationRes = await wx.getLocation()
// 打印地理位置信息
console.log(locationRes)
} catch (err) {
console.log(err)
}
} else {
try {
// 如果是第一次调用 getLocation 或者之前授权过
// 直接调用 getLocation 获取用户信息即可
const locationRes = await wx.getLocation()
console.log(locationRes)
} catch (error) {
wx.toast({ title: '您拒绝授权获取地址位置' })
}
}
}
- 地理位置接口新增与相关流程调整
- permission 字段说明