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

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

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);
    }
  }
  //其它结构...
相关推荐
克里斯蒂亚诺更新1 小时前
微信小程序使用vant4 weapp自定义菜单 但是弹出层却被菜单遮挡的解决办法
微信小程序·小程序·notepad++
静Yu2 小时前
从一个九宫格素材小程序,看轻量工具产品该如何优化体验
前端·微信小程序
小羊Yveesss5 小时前
2026年微信小程序制作工具怎么选?
微信小程序·小程序
河北清兮网络科技7 小时前
深度解析:2026石家庄短视频APP开发真实成本、隐性开销与避坑方案
大数据·小程序·app·短剧app·广告联盟
微擎应用7 小时前
宠物门店系统 - 连锁宠物医院多门店小程序+公众号双端管理系统
小程序·宠物
脱脱克克8 小时前
使用 TRAE / VS Code + DeepSeek V4 开发微信小程序、网页
微信小程序·ai编程·环境配置
2501_915921438 小时前
uni-app 上架 iOS 的完整流程(无需依赖 Mac)
android·macos·ios·小程序·uni-app·iphone·webview
前端 贾公子8 小时前
使用 wxappUnpacker 工具进行 MAC 微信小程序反编译
macos·微信小程序·小程序
CRMEB系统商城21 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
嫂子的姐夫1 天前
050-wx小程序合肥住房
爬虫·python·小程序·逆向