微信小程序权限授权工具类

最近写微信小程序的时候需要在页面获取设备权限,又不想每个页面都写,就写了一个工具类方便管理

js 复制代码
/**
 * 权限工具类用于获取授权
 * 权限工具类使用方法,注意调用时函数需要定义为异步函数 async
 * import PermissionUtils from "./permissionUtils"
 * 
 * try {
 *     const hasPermission = await PermissionUtils.requestPermission('CAMERA', '自定义提示信息,可以不传入,默认值已经定义');
 *     console.log(hasPermission)
 *   } catch (error) {
 *     console.error('权限请求失败:', error);
 *   }
 * 
 */
// permissionUtils.js
class PermissionUtils {
  // 权限枚举,包含默认提示信息
  static Permissions = {
    USER_LOCATION: {
      scope: 'scope.userLocation',
      defaultMessage: '您未开启精确地理位置权限,将影响相关功能使用,请在设置中手动开启。'
    },
    USER_FUZZY_LOCATION: {
      scope: 'scope.userFuzzyLocation',
      defaultMessage: '您未开启模糊地理位置权限,将影响相关功能使用,请在设置中手动开启。'
    },
    USER_LOCATION_BACKGROUND: {
      scope: 'scope.userLocationBackground',
      defaultMessage: '您未开启后台定位权限,将影响相关功能使用,请在设置中手动开启。'
    },
    RECORD: {
      scope: 'scope.record',
      defaultMessage: '您未开启麦克风权限,将影响相关功能使用,请在设置中手动开启。'
    },
    CAMERA: {
      scope: 'scope.camera',
      defaultMessage: '您未开启摄像头权限,将影响相关功能使用,请在设置中手动开启。'
    },
    BLUETOOTH: {
      scope: 'scope.bluetooth',
      defaultMessage: '您未开启蓝牙权限,将影响相关功能使用,请在设置中手动开启。'
    },
    WRITE_PHOTOS_ALBUM: {
      scope: 'scope.writePhotosAlbum',
      defaultMessage: '您未开启添加到相册权限,将影响相关功能使用,请在设置中手动开启。'
    },
    ADD_PHONE_CONTACT: {
      scope: 'scope.addPhoneContact',
      defaultMessage: '您未开启添加到联系人权限,将影响相关功能使用,请在设置中手动开启。'
    },
    ADD_PHONE_CALENDAR: {
      scope: 'scope.addPhoneCalendar',
      defaultMessage: '您未开启添加到日历权限,将影响相关功能使用,请在设置中手动开启。'
    },
    WERUN: {
      scope: 'scope.werun',
      defaultMessage: '您未开启微信运动步数权限,将影响相关功能使用,请在设置中手动开启。'
    },
    ADDRESS: {
      scope: 'scope.address',
      defaultMessage: '您未开启通讯地址权限,将影响相关功能使用,请在设置中手动开启。'
    },
    INVOICE_TITLE: {
      scope: 'scope.invoiceTitle',
      defaultMessage: '您未开启发票抬头权限,将影响相关功能使用,请在设置中手动开启。'
    },
    INVOICE: {
      scope: 'scope.invoice',
      defaultMessage: '您未开启获取发票权限,将影响相关功能使用,请在设置中手动开启。'
    },
    USER_INFO: {
      scope: 'scope.userInfo',
      defaultMessage: '您未开启用户信息权限,将影响相关功能使用,请在设置中手动开启。'
    }
  };

  static async requestPermission(permissionKey, customMessage = null) {
    const permission = PermissionUtils.Permissions[permissionKey];
    if (!permission) {
      throw new Error(`未知权限类型: ${permissionKey}`);
    }

    // 获取当前权限状态
    const setting = await new Promise((resolve, reject) => {
      wx.getSetting({
        success: (res) => resolve(res),
        fail: (err) => reject(err)
      });
    });

    const authSetting = setting.authSetting || {};

    if (!authSetting[permission.scope]) {
      // 用户尚未授权
      const authorizeResult = await new Promise((resolve, reject) => {
        wx.authorize({
          scope: permission.scope,
          success: (res) => resolve(res),
          fail: (err) => resolve({ errMsg: 'authorize:fail auth deny' }) // 处理授权失败的情况
        });
      });

      if (authorizeResult.errMsg === 'authorize:ok') {
        // 用户同意授权
        return true;
      } else {
        // 用户拒绝授权
        const message = customMessage || permission.defaultMessage;
        const modalResult = await new Promise((resolve) => {
          wx.showModal({
            title: '提示',
            content: message,
            showCancel: true,
            cancelText: '残忍拒绝',
            confirmText: '立即前往',
            success: (res) => {
              if (res.confirm) {
                // 用户点击了确定
                wx.openSetting({
                  success: (res) => {
                    if (res.authSetting[permission.scope]) {
                      // 用户在设置中开启了权限
                      resolve(true);
                    } else {
                      // 用户在设置中仍然拒绝权限
                      resolve(false);
                    }
                  },
                  fail: (err) => {
                    console.error('打开设置页面失败:', err);
                    resolve(false);
                  }
                });
              } else {
                // 用户点击了取消
                resolve(false);
              }
            }
          });
        });
        return modalResult;
      }
    } else {
      // 用户已经授权
      return true;
    }
  }
}

module.exports = PermissionUtils;

示例代码

js 复制代码
import PermissionUtils from "../../../../utils/permissionUtils"
//其它结构...
  async test() {
    try {
      const hasPermission = await PermissionUtils.requestPermission('CAMERA');
    //....你的代码
    } catch (error) {
      // console.error('权限请求失败:', error);
    }
  }
  //其它结构...
相关推荐
省钱兄--zs5 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
李洋-蛟龙腾飞公司6 小时前
微信小程序商城迁移鸿元服务实战
微信小程序·小程序
无限聚核8 小时前
抖音 certificate.prepare 之后怎么验券?和美团 msconsume 差在哪,无限聚核
前端·微信小程序
Autumn_ing10 小时前
AI生成应用能做到哪一步?在线问诊APP从挂号到支付的完整案例
小程序·app·健康医疗·ai应用·问诊app·ai生成应用·墨刀ai
火眼金睛记单词10 小时前
攻克考研英语熟词僻义:解锁高分密码的关键一步
经验分享·考研·小程序
YueLin11111 小时前
直播卖货小程序哪个好用?2026 年三大阵营与适配场景
小程序
拖孩13 小时前
# AI 帮我写的小程序,上线不到一个月流量主突然爆了
前端·后端·微信小程序
IT_陈寒14 小时前
微信小程序:题上岸
微信小程序
m0_5873830014 小时前
无人自助拼豆系统开发实战指南 核心功能架构搭建与落地经验分享
java·经验分享·spring·小程序·架构·需求分析
Ai-_Man14 小时前
DeepSeek生成的内容能否下载吗?
开发语言·javascript·人工智能·小程序·ecmascript