更新记录

1.0.0(2026-09-04)

首次发布


平台兼容性

uni-app(5.23)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × - 6.0 12 -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

lucis-permission

检测、请求 App 运行时权限(录音、相机、存储/相册、定位、蓝牙)以及推送通知权限的 UTS 插件,兼容 iOS 和 Android 平台。

功能特性

  • ✅ 检测权限状态(已授权 / 已拒绝 / 未决定 / 未知)
  • ✅ 主动请求权限(弹出系统授权对话框)
  • ✅ 跳转系统设置页面
  • ✅ 支持权限:录音/麦克风、相机、存储/相册、定位、蓝牙
  • ✅ 推送通知权限检测(checkPushPermission)与设置跳转(openPushSettings
  • ✅ 权限事件监听(requesting / granted / denied / checkedonPermissionEvent / offPermissionEvent
  • ✅ 兼容 iOS 12.0+
  • ✅ 兼容 Android 6.0+ (API 23+),适配 Android 13+ 媒体权限
  • ✅ 支持 Vue 2 / Vue 3 + UTS

安装

lucis-permission 文件夹放入项目的 uni_modules 目录下即可。

使用方法

1. 引入插件

import {
  checkPermission,
  requestPermission,
  openPermissionSettings,
  checkPushPermission,
  openPushSettings,
  onPermissionEvent,
  offPermissionEvent
} from '@/uni_modules/lucis-permission'

2. 检测权限

// 检测录音权限状态(回调式 API,兼容 iOS 平台)
checkPermission({
  type: 'record',
  success: (result) => {
    console.log('权限类型:', result.type)     // 'record'
    console.log('权限状态:', result.status)   // 'granted' | 'denied' | 'not_determined' | 'unknown'
    console.log('是否已授权:', result.granted)
    console.log('描述信息:', result.message)
  },
  fail: (result) => {
    console.log('检测失败/未授权:', result.message, result.errCode)
  }
})

3. 请求权限

// 请求存储/相册权限(回调式 API,兼容 iOS 平台)
requestPermission({
  type: 'storage',
  complete: (result) => {
    if (result.granted) {
      console.log('权限已授予')
    } else {
      // 权限被拒绝,可引导用户打开设置
      uni.showModal({
        title: '需要权限',
        content: result.message,
        confirmText: '去设置',
        success: (res) => {
          if (res.confirm) {
            openPermissionSettings()
          }
        }
      })
    }
  }
})

4. 打开系统设置

openPermissionSettings((success) => {
  if (success) {
    console.log('已跳转到系统设置页面')
  }
})

5. 推送通知权限

推荐直接使用统一的 checkPermission 检测推送(type 为 'push',与 checkPushPermission 等价,结果带 type: 'push'):

import { checkPermission } from '@/uni_modules/lucis-permission'

// 统一入口:检测推送通知权限状态(等价于 checkPushPermission)
checkPermission({
  type: 'push',
  complete: (result) => {
    console.log('权限类型:', result.type)     // 'push'
    console.log('推送状态:', result.status)   // 'granted' | 'denied' | 'unknown' | 'not_determined'
    console.log('是否已授权:', result.granted)
    console.log('描述信息:', result.message)
  }
})

如需独立 API 或仅打开推送设置:

import { checkPushPermission, openPushSettings } from '@/uni_modules/lucis-permission'

// 独立检测推送权限(返回 PushPermissionResult,无 type 字段)
checkPushPermission({
  complete: (result) => {
    console.log('推送状态:', result.status, '是否授权:', result.granted)
  }
})

// 打开系统推送设置页面
openPushSettings((ok) => {
  console.log('跳转结果:', ok)
})

提示:requestPermission({ type: 'push' }) 不会弹出系统授权框(iOS/Android 推送授权均在系统设置中开启),会通过回调返回当前状态并提示"请在系统设置中开启"。

6. 权限事件监听

插件提供全局事件监听,覆盖 requesting / granted / denied / checked 四类事件,方便在页面统一处理授权结果(如弹窗引导用户去设置):

// 注册监听,返回令牌 token
// 注意:uni-app(非 x)的 UTS 插件 JS 回调仅支持单参数,event 与 result 合并为 data 对象
const token = onPermissionEvent((data) => {
  // data.event: 'requesting' | 'granted' | 'denied' | 'checked'
  // data.result: PermissionResult
  const { event, result } = data
  console.log('权限事件:', event, '类型:', result.type, '状态:', result.status, result.message)

  if (event === 'denied' && !result.granted) {
    uni.showModal({
      title: '提示',
      content: '权限被拒绝',
      confirmText: '去设置',
      success: (e) => {
        if (e.confirm) openPermissionSettings()
      }
    })
  }
})

// 移除监听(传入注册时返回的 token)
offPermissionEvent(token)

事件说明:

  • requesting:权限将要被请求(系统授权弹窗弹出前触发)
  • granted:权限请求成功,已授权
  • denied:权限请求被拒绝(含部分授权、拒绝且不再询问)
  • checked:权限检测完成(checkPermission 返回结果后触发)

回调参数 data(PermissionEventData):

  • data.event:事件类型(requesting / granted / denied / checked
  • data.resultPermissionResult,关联的权限结果(字段见下方「checkPermission」回调结果说明)

API 说明

统一回调式 API:插件遵循 uni-app UTS 插件规范,使用 success / fail / complete 回调返回结果(不返回 Promise,因为 uni-app 的 iOS 端 UTS 插件不支持 Promise 返回值,前端 await 会拿到 undefined)。

  • success:成功回调(errCode === 0 时触发)
  • fail:失败回调(errCode !== 0,如被拒绝 / 未授权 / 异常)
  • complete:完成回调(无论成功失败都会触发,参数与 success/fail 相同)

checkPermission(options)

检测指定权限的状态。

参数: options

字段 类型 说明
type PermissionType 权限类型
success (result) => void 成功回调
fail (result) => void 失败回调
complete (result) => void 完成回调

type 可选值:

说明
record 录音/麦克风
camera 相机
storage 存储/相册
location 定位
bluetooth 蓝牙(iOS 由系统在首次使用蓝牙 API 时自动弹窗,Android 需在 manifest 声明蓝牙权限)
push 推送通知权限(与 checkPushPermission 等价,统一走 checkPermission({ type: 'push' }) 即可)

回调结果 result(PermissionResult):

字段 类型 说明
type PermissionType 权限类型
status PermissionStatus 权限状态
granted boolean 是否已授权
message string 详细描述信息
errCode number 错误码(成功时为0)
errMsg string 错误信息(成功时为空字符串)

注意:字段名为 granted(非 isGranted),Kotlin 对 is 前缀属性会生成特殊 getter/setter 导致跨桥字段丢失。

PermissionStatus 枚举值:

  • granted - 已授权
  • denied - 已拒绝
  • not_determined - 用户尚未决定(可主动请求)
  • unknown - 未知状态

requestPermission(options)

主动请求指定权限,弹出系统授权对话框。

参数:checkPermission{ type, success?, fail?, complete? }

提示:请求前插件会自动检测,若权限已授予则直接回调成功,不会重复弹窗。请求过程会派发 requesting / granted / denied 事件。

openPermissionSettings(complete)

打开系统应用设置页面,引导用户手动开启权限。

参数: complete - 回调函数 (success: boolean) => void,是否成功跳转

checkPushPermission(options)

检测推送通知权限状态。

参数: options

字段 类型 说明
success (result) => void 成功回调
fail (result) => void 失败回调
complete (result) => void 完成回调

回调结果 result(PushPermissionResult):

字段 类型 说明
status PushPermissionStatus 权限状态(granted / denied / unknown / not_determined)
granted boolean 是否已授权
message string 详细描述信息
errCode number 错误码(成功时为0)
errMsg string 错误信息(成功时为空字符串)

openPushSettings(complete)

打开系统推送通知设置页面。

参数: complete - 回调函数 (success: boolean) => void,是否成功跳转

onPermissionEvent(listener)

注册权限事件全局监听(requesting / granted / denied / checked)。

参数: listener - 回调函数 (data: PermissionEventData) => void

回调参数 data(PermissionEventData):

字段 类型 说明
event PermissionEventType 事件类型(requesting / granted / denied / checked)
result PermissionResult 关联的权限结果(字段见「checkPermission」回调结果说明)

注意:uni-app(非 x)的 UTS 插件 JS 回调仅支持单参数,故 eventresult 合并为 data 对象。若按两参 (event, result) 书写,Android 端会抛 ClassCastException

返回值: PermissionEventToken - 注册令牌,用于 offPermissionEvent 取消监听

注意:监听器为全局生效(模块级数组),页面退出时记得调用 offPermissionEvent 移除,避免重复注册导致事件日志成倍。建议在页面中使用模块级 token 管理(可参考 example 示例页)。

offPermissionEvent(token)

移除权限事件监听。

参数: token - onPermissionEvent 返回的注册令牌

平台兼容性

平台 最低版本 说明
iOS 12.0+ 使用 AVCaptureDevice / PHPhotoLibrary / CLLocationManager
Android 6.0+ (API 23+) 使用 context.checkSelfPermission / XXPermissions

Android 版本适配

  • Android 13+ (API 33+): 存储权限检测 READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
  • Android 6.0-12 (API 23-32): 存储权限检测 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE
  • Android 6.0+: 运行时权限请求基于 UTSAndroid.requestSystemPermission

权限配置

插件的 app-android/AndroidManifest.xmlapp-ios/Info.plist 已内置所需权限声明与使用说明,打包时自动合并。部分平台仍建议在 manifest.json 中补充声明:

Android

manifest.jsonapp-plus -> distribute -> android -> permissions 中添加需要的权限:

[
  "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
  "<uses-permission android:name=\"android.permission.CAMERA\"/>",
  "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
  "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
  "<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>",
  "<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\"/>",
  "<uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\"/>",
  "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
  "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
  "<uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>",
  "<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>",
  "<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/>"
]

POST_NOTIFICATIONS 用于 Android 13+(API 33+)推送通知权限检测;BLUETOOTH_SCAN / BLUETOOTH_CONNECT 用于蓝牙权限检测(Android 12+ / API 31+)。

注意:真机运行 UTS 插件需要使用自定义基座,修改权限声明后需重新打包自定义基座或提交云打包。

iOS

插件内置 Info.plist 已包含以下使用说明,如需自定义文案可在项目的 manifest.json -> app-plus -> distribute -> ios -> privacyDescription 中覆盖:

  • NSMicrophoneUsageDescription - 录音
  • NSCameraUsageDescription - 相机
  • NSPhotoLibraryUsageDescription - 相册读取
  • NSPhotoLibraryAddUsageDescription - 相册写入
  • NSLocationWhenInUseUsageDescription - 使用期间定位

错误码

错误码 说明
0 成功
1001 Android: 无法获取应用上下文
1002 Android: 无法获取当前 Activity / 无法获取通知管理器
1003 Android: 权限被拒绝或未授予
1004 Android: 推送通知已被关闭
1005 Android: 通知处于免打扰模式
2001 iOS: 权限被拒绝(含推送被拒绝)
2002 iOS: 权限受限(系统限制)/ 推送权限未决定
2003 iOS: 权限状态未知 / 未决定
2004 iOS: 蓝牙权限未决定(首次使用蓝牙 API 时系统自动弹窗)
9000 未知的权限类型
9999 系统错误

更新记录

  • 1.0.0:初始版本,支持权限检测、请求、设置跳转、推送通知权限与权限事件监听。

许可证

MIT License

隐私、权限声明

1. 本插件需要申请的系统权限列表:

录音、相机、存储/相册、定位等系统权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

不收集任何用户数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。