微信小程序使用一些系统功能或者获取私人信息前都要申请权限,如果用户拒绝之后,该功能则无法使用,且再次点击也不会再申请权限,需要用户到设置内开启权限,今天就介绍一下微信小程序如何优雅的申请权限
首先,应该在调用需要权限的api的时候,在success中执行正确的逻辑,在fail里面处理没有获取权限后的处理。
我先定义一个获取地址位置信息的函数
var getLocation = function () {
  return new Promise((resolve, reject) => {
      // 先正常获取location
    wxp.getLocation({ type: 'gcj02' }).then(res => {
      resolve(res)
    }).catch(err => {
      if (err.errMsg == "getLocation:fail auth deny" || err.errMsg == "getLocation:fail authorize no response") {
        // 权限问题
        permission.location().then(res => {
                  // 获取权限成功重新获取location
          wxp.getLocation({ type: 'gcj02' }).then(res => {
            resolve(res)
          })
        }).catch(err => {
          reject()
        })
      } else {
        // 其他问题
        reject()
      }
    })
  })
}为了不让代码缩进太多 我把 permission.location() 单独拆出来用来单独处理没有获取权限后的问题
var _apply = function (scope = 'scope.userLocation', title = '是否授权', content = '请去设置授权,否则将导致功能无法使用') {
  return new Promise((resolve, reject) => {
    wx.getSetting({
      success: function (res) {
        var scopes = res.authSetting;
        if (!scopes[scope]) {
          // 申请去设置授权
          wx.showModal({
            title: title,
            content: content,
            success: function (e) {
              if (e.confirm) {
                wx.openSetting({
                  success: function (data) {
                    if (data.authSetting[scope] === true) {
                      // 获取授权成功
                      resolve()
                    } else {
                      //授权失败
                      reject()
                    }
                  },
                  fail: function (err) {
                    // 打开设置失败
                    reject()
                  }
                })
              } else {
                // 用户点了取消
                reject()
              }
            }
          })
        } else {
          resolve()
        }
      },
    })
  })
}
var location = function (title='需要获取您的地理位置', content='请去设置授权,否则将导致部分功能无法使用') {
  return _apply('scope.userLocation', title, content)
}
export default {
  location
}如此以来,如果用户首次调用获取地理位置,如果他拒绝了,那么会提示用户是否去设置授权,确定后跳转设置,授权后返回继续执行后面的逻辑。
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: http://45.76.225.121/article/267