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

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

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);
    }
  }
  //其它结构...
相关推荐
微擎应用市场3 小时前
心灵馆咨询系统小程序:一站式心理咨询服务解决方案
小程序
2501_915918414 小时前
怎么把 Python 写的 Flet 应用打包成 iOS App 并上架 App Store?
android·ios·小程序·https·uni-app·iphone·webview
Geek_Vison4 小时前
小程序容器如何抹平系统差异,让一个小程序运行在 iOS、安卓、鸿蒙和电脑端
小程序·uni-app·harmonyos·mpaas
微笑的曙光6 小时前
第一期 · 本地优先 MVP:不写一个后端,如何做出完整体验
微信小程序
EatFan7 小时前
Java接入微信支付保姆式教程(三):SpringBoot 接入微信支付并完成统一下单
微信小程序·微信支付·springboot
2601_949950639 小时前
练题簿:把备考资料装进小程序,随时开启高效在线刷题
人工智能·小程序·刷题·练习·小程序推荐
QQ_21696290969 小时前
基于SpringBoot+Vue的小生活平台的设计与实现
java·数据库·vue.js·spring boot·spring·微信小程序·生活
飞梦工作室9 小时前
H5页面能否直接播放视频号直播?实战方案与踩坑总结
微信小程序·小程序
河南花仙子科技1 天前
企业定制小游戏助力品牌软性传播
大数据·科技·游戏·小程序
StevenLdh1 天前
情绪小恐龙:一个微信小程序从架构设计到部署上线的全记录
微信小程序·小程序·notepad++