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

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

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);
    }
  }
  //其它结构...
相关推荐
好赞科技7 小时前
深度测评2026年精选美发预约小程序排行榜 革新预约新体验 修订
大数据·微信小程序
一颗无敌码农12 小时前
多商户与多门店电商系统有什么区别?核心模式解析
微信小程序·php·用户运营·crmeb
wuyoula16 小时前
全新多平台电商代付商城源码
开发语言·c++·ui·小程序·php源码
低代码布道师16 小时前
微搭低代码MBA 培训管理系统实战 36——小程序端课程预约功能实现
低代码·小程序
万岳科技系统开发16 小时前
小程序直播架构调整指南:H5嵌套模式的优化与替代方案
小程序·架构
Greg_Zhong17 小时前
学习AI 工程师第 3 天:小程序中调用豆包模型,实现ai助手(打字机效果与流式输出)
小程序·ai工程师·小程序调用豆包实现ai助手
于先生吖18 小时前
家政派单小程序定制厂家
大数据·小程序
00后程序员张18 小时前
完整指南 iOS App上架到App Store的步骤详解
macos·ios·小程序·uni-app·objective-c·cocoa·iphone
hhzz19 小时前
记录微信小程序tabbar不显示问题:uni-app Vue 3 自定义 tabBar 不渲染
vue.js·微信小程序·uni-app
久爱@勿忘19 小时前
uniappH5跳转小程序
前端·小程序·uni-app