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

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

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);
    }
  }
  //其它结构...
相关推荐
じòぴé南冸じょうげん5 小时前
小程序的project.private.config.json是无依赖文件,那可以删除吗?
前端·小程序·json
2501_916013746 小时前
HTTPS 抓包难点分析,从端口到工具的实战应对
网络协议·http·ios·小程序·https·uni-app·iphone
2501_915918418 小时前
uni-app 项目 iOS 上架效率优化 从工具选择到流程改进的实战经验
android·ios·小程序·uni-app·cocoa·iphone·webview
00后程序员张9 小时前
如何在不同 iOS 设备上测试和上架 uni-app 应用 实战全流程解析
android·ios·小程序·https·uni-app·iphone·webview
微三云-轩9 小时前
区块链:重构企业数字化的信任核心与创新动力
人工智能·小程序·区块链·生活·我店
阿隆_趣编程11 小时前
为了方便相亲,我用AI写了一款小程序
前端·javascript·微信小程序
2501_915918411 天前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
黑马源码库miui520861 天前
JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
java·微信·微信小程序·小程序·uni-app
一口十个小甜虾1 天前
微信小程序体验版,当打开调试模式正常访问,关闭之后无法访问
微信小程序·小程序
悟空码字1 天前
微信开放平台第三方平台,可以管理多个微信小程序
微信·小程序·开放平台