在开发的过程中,我们会发现一个问题:
在调用 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 字段说明



















