|
|
5 дней назад | |
|---|---|---|
| .. | ||
| utssdk | 5 дней назад | |
| changelog.md | 5 дней назад | |
| index.d.ts | 5 дней назад | |
| index.ts | 5 дней назад | |
| package.json | 5 дней назад | |
| readme.md | 5 дней назад | |
| 使用规范.md | 5 дней назад | |
| 发布指南.md | 5 дней назад | |
| 权限配置说明.md | 5 дней назад | |
uni-app Vue3 跨端权限管理 UTS 插件,支持 Android / iOS / Harmony 三端,提供统一的权限检查与申请 API。
插件位于 src/uni_modules/m-permission-manager/,随项目直接使用,无需额外安装。
插件市场仅展示本 readme,下方链接为文内锚点,可直接跳转。
| 文档 | 说明 |
|---|---|
| 使用规范 | 集成约束、推荐流程、审核注意事项 |
| 权限配置说明 | Android / iOS / Harmony 三端权限文件配置详解 |
| 发布指南 | DCloud 插件市场发布填写参考(插件作者) |
| 更新日志 | 版本更新记录 |
import {
checkPermission,
requestPermission,
requestPermissions,
openAppSettings,
getSupportedPermissions,
} from '@/utils/permission-manager'
// 检查相机权限
const result = await checkPermission('camera')
console.log(result.granted, result.status)
// 申请相机权限
const granted = await requestPermission('camera')
if (!granted) {
await openAppSettings()
}
// 批量申请
const batch = await requestPermissions(['camera', 'microphone', 'location'])
console.log(batch.allGranted, batch.results)
import { requestPermission } from '@/uni_modules/m-permission-manager'
requestPermission({
permission: 'camera',
success(res) {
console.log(res.granted)
},
fail(err) {
console.error(err.errCode, err.errMsg)
},
})
| 权限 Key | 说明 | Android | iOS | Harmony |
|---|---|---|---|---|
camera |
相机 | ✅ | ✅ | ✅ |
photoLibrary |
相册 | ✅ | ✅ | ✅ |
storage |
存储(写) | ✅ | ✅* | ✅ |
readStorage |
存储(读) | ✅ | ✅* | ✅ |
location |
精确定位 | ✅ | ✅ | ✅ |
coarseLocation |
大致定位 | ✅ | ✅* | ✅ |
microphone |
麦克风 | ✅ | ✅ | ✅ |
contacts |
通讯录(读) | ✅ | ✅ | ✅ |
writeContacts |
通讯录(写) | ✅ | ✅* | ✅ |
bluetooth |
蓝牙 | ✅ | ✅ | ✅ |
phone |
拨打电话 | ✅ | ❌ | ❌ |
phoneState |
电话状态 | ✅ | ❌ | ❌ |
sms |
发送短信 | ✅ | ❌ | ❌ |
readSms |
读取短信 | ✅ | ❌ | ❌ |
receiveSms |
接收短信 | ✅ | ❌ | ❌ |
overlay |
悬浮窗 | ✅ | ❌ | ❌ |
writeSettings |
系统设置 | ✅ | ❌ | ❌ |
*iOS 部分权限映射到相近的系统权限(如 storage → 相册)
| status | 说明 |
|---|---|
granted |
已授权 |
denied |
已拒绝 |
notDetermined |
尚未请求 |
restricted |
受限制(如家长控制) |
unsupported |
当前平台不支持 |
| 方法 | 说明 |
|---|---|
checkPermissionSync(key) |
同步检查单个权限 |
checkPermissionsSync(keys[]) |
同步检查多个权限 |
checkPermission(options) |
异步检查单个权限 |
checkPermissions(options) |
异步检查多个权限 |
requestPermission(options) |
申请单个权限 |
requestPermissions(options) |
申请多个权限 |
openAppSettings(options?) |
打开系统应用设置 |
openPermissionSettings(key) |
按权限类型打开对应设置页(封装层) |
getSupportedPermissionsSync() |
获取当前平台支持的权限列表 |
完整配置说明见 权限配置说明。
在 manifest.json → app-plus.distribute.android.permissions 中声明所需权限,例如:
"permissions": [
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>"
]
Android 13+ 读写媒体文件需使用 READ_MEDIA_IMAGES / READ_MEDIA_VIDEO;插件会同时校验设备 API 与宿主 targetSdkVersion,仅当 targetSdkVersion >= 33 时才申请新媒体权限,否则回退 READ_EXTERNAL_STORAGE(兼容未升级 targetSdk 的自定义基座)。
在 manifest.json → app-plus.distribute.ios.privacyDescription 中配置权限说明,例如:
"privacyDescription": {
"NSCameraUsageDescription": "需要使用相机进行拍照",
"NSMicrophoneUsageDescription": "需要使用麦克风进行录音",
"NSPhotoLibraryUsageDescription": "需要访问相册以选择图片",
"NSLocationWhenInUseUsageDescription": "需要获取位置信息",
"NSBluetoothAlwaysUsageDescription": "需要使用蓝牙连接周边设备"
}
iOS 蓝牙说明:蓝牙授权开关出现在「设置 → 本 App → 蓝牙」(需声明
NSBluetoothAlwaysUsageDescription且 App 曾触发过蓝牙权限弹窗)。若 App 设置页无该项,请前往「设置 → 隐私与安全性 → 蓝牙」。系统蓝牙开关在「设置 → 蓝牙」,与应用授权无关。Apple 不提供跳转到「隐私 → 蓝牙」的公开深链,插件会打开 App 设置页并配合引导文案。
插件 utssdk/app-harmony/module.json5 已声明鸿蒙端全部可映射的 9 项权限:
| 权限 Key | ohos.permission | APL 等级 | 说明 |
|---|---|---|---|
camera |
CAMERA | normal | 可直接安装使用 |
microphone |
MICROPHONE | normal | 可直接安装使用 |
location |
LOCATION | normal | 可直接安装使用 |
coarseLocation |
APPROXIMATELY_LOCATION | normal | 可直接安装使用 |
bluetooth |
ACCESS_BLUETOOTH | normal | 可直接安装使用 |
photoLibrary / readStorage |
READ_IMAGEVIDEO | system_basic | 需 ACL 签名 |
storage |
WRITE_IMAGEVIDEO | system_basic | 需 ACL 签名 |
contacts |
READ_CONTACTS | system_basic | 需 ACL 签名 |
writeContacts |
WRITE_CONTACTS | system_basic | 需 ACL 签名 |
鸿蒙不支持(无系统 API):phone、phoneState、sms、readSms、receiveSms、overlay、writeSettings。
| 文件 | 权限数量 | 用途 |
|---|---|---|
module.json5 |
5 项(normal) | 默认,调试证书可直接安装 |
module.normal.json5 |
5 项 | 与 module.json5 相同 |
module.full.json5 |
9 项 | 含相册/通讯录等 system_basic 权限,需 ACL 后启用 |
启用完整权限:将 module.full.json5 的内容覆盖 module.json5,并在 AppGallery Connect 配置 ACL 签名。
说明当前 module.json5 中仍包含未签名的 system_basic 权限(如 READ_CONTACTS)。请确认使用的是默认的 5 项 normal 版本;若已手动合并 module.full.json5,需先完成 ACL 白名单与 Profile 签名配置。
相册选图场景仍推荐使用系统 PhotoViewPicker(uni.chooseImage),无需申请媒体读写权限。
默认 module.json5 为可安装调试包,未声明 READ_IMAGEVIDEO / WRITE_IMAGEVIDEO,因此:
若业务必须申请媒体读写权限:用 module.full.json5 覆盖 module.json5,在 AppGallery Connect 配置 ACL 并重新签名安装后,系统设置中才会出现对应权限项。
| errCode | 说明 |
|---|---|
| 9020001 | 当前环境不支持 |
| 9020002 | 用户拒绝授权 |
| 9020003 | 权限不支持当前平台 |
| 9020004 | 打开系统设置失败 |
| 9020005 | 权限检查失败 |
| 9020006 | 权限申请失败 |
openAppSettings() 手动开启。overlay)和系统设置(writeSettings)需跳转系统设置页授权,申请结果可能为 notDetermined。本文档面向集成本插件的 App 开发者,说明 必须遵守的约束、推荐做法 和 上架审核注意事项。
requestPermission / requestPermissions 必须由真实用户手势触发,例如按钮 click / tap。
<!-- ✅ 正确 -->
<button @click="handleRequestCamera">申请相机权限</button>
<!-- ❌ 错误:页面 onLoad / onShow 自动批量申请 -->
<script setup>
onMounted(async () => {
await requestPermissions(['camera', 'microphone', 'location']) // 体验差,可能被系统限制
})
</script>
原因:Android / iOS / Harmony 运行时权限弹窗均面向用户明确操作;冷启动批量申请易触发拒绝,且不符合各应用商店审核惯例。
仅安装插件不够,必须在各端配置文件中声明所需权限,否则:
| 平台 | 未声明后果 |
|---|---|
| Android | SecurityException、申请无弹窗或直接失败 |
| iOS | 崩溃或无授权弹窗 |
| Harmony | 系统设置无对应开关,插件返回 restricted 或 9020003 |
详细配置见 权限配置说明。
只申请业务实际使用的权限。在功能入口处按需 requestPermission,不要一次性申请全部权限。
// ✅ 审核页
async function handleRequestCamera() {
const granted = await requestPermission('camera')
if (!granted) {
uni.showModal({
title: '需要相机权限',
content: getPermissionSettingsGuide('camera', '相机'),
confirmText: '去设置',
success: (res) => {
if (res.confirm) openPermissionSettings('camera')
},
})
return
}
// 继续业务逻辑
}
调用前可通过 getSupportedPermissions() 过滤当前平台不支持的 Key,避免向用户展示无效入口。
const supported = getSupportedPermissions()
const canUseOverlay = supported.includes('overlay') // 仅 Android 为 true
进入功能页
↓
checkPermission(key) ──→ granted → 执行业务
↓ notDetermined / denied
用户点击「申请权限」
↓
requestPermission(key)
↓
系统弹窗 ──→ 拒绝 → getPermissionSettingsGuide + openPermissionSettings
↓ 同意
granted → 执行业务
项目可复用 @/utils/permission-manager.js:
import {
checkPermission,
requestPermission,
requestPermissions,
openPermissionSettings,
getPermissionSettingsGuide,
ensurePermission,
getSupportedPermissions,
} from '@/utils/permission-manager'
| 方法 | 用途 |
|---|---|
checkPermission(key) |
检查状态,返回 { granted, status } |
requestPermission(key) |
申请权限,返回 boolean |
requestPermissions(keys[]) |
批量申请,返回 { allGranted, results } |
openPermissionSettings(key) |
按权限类型跳转系统设置 |
getPermissionSettingsGuide(key, label) |
获取跳转前的引导文案 |
ensurePermission(key, { openSettings }) |
检查 → 申请 → 可选跳转设置 |
import { requestPermission } from '@/uni_modules/m-permission-manager'
requestPermission({
permission: 'camera',
success(res) {
if (res.granted) { /* ... */ }
},
fail(err) {
console.error(err.errCode, err.errMsg)
},
})
用户选择「不再询问」或多次拒绝后,应引导至系统设置:
const granted = await requestPermission('bluetooth')
if (!granted) {
uni.showModal({
title: '蓝牙权限未授予',
content: getPermissionSettingsGuide('bluetooth', '蓝牙'),
confirmText: '去设置',
success: (res) => {
if (res.confirm) openPermissionSettings('bluetooth')
},
})
}
各端跳转行为:
| 平台 | openPermissionSettings 行为 |
|---|---|
| Android 普通权限 | 应用详情 → 权限列表 |
Android overlay |
悬浮窗权限设置页 |
Android writeSettings |
修改系统设置权限页 |
| iOS | 本 App 设置页(需 manifest 声明对应 UsageDescription) |
| Harmony | 系统设置 → 应用详情 |
READ_MEDIA_IMAGES / READ_MEDIA_VIDEOBLUETOOTH_CONNECT / BLUETOOTH_SCANoverlay、writeSettings 需跳转系统设置页,申请结果可能为 notDetermined,返回后需再次 checkPermissionprivacyDescription 中配置对应 NS*UsageDescription,否则无弹窗storage / readStorage 映射到相册权限(PHPhotoLibrary)coarseLocation / location 均映射到定位授权NSBluetoothAlwaysUsageDescription;系统蓝牙开关在「设置 → 蓝牙」,App 授权在 App 设置页或「隐私与安全性 → 蓝牙」module.json5 含 5 项 normal 权限,调试包可直接安装system_basic,需 ACL 签名 + module.full.json5uni.chooseImage(系统 PhotoViewPicker),无需媒体读写权限restricted,申请返回 9020003| errCode | 含义 | 建议提示 |
|---|---|---|
| 9020001 | 当前环境不支持 | 请在 App 端使用 |
| 9020002 | 用户拒绝授权 | 您拒绝了授权,可在设置中重新开启 |
| 9020003 | 权限不支持当前平台 | 当前平台不支持该权限 |
| 9020004 | 打开系统设置失败 | 无法打开系统设置,请手动前往 |
| 9020005 | 权限检查失败 | 权限检查失败,请重试 |
| 9020006 | 权限申请失败 | 权限申请失败,请重试 |
| 市场 | 注意点 |
|---|---|
| App Store | 每个 NS*UsageDescription 文案需与真实功能一致;不要申请未使用的权限 |
| Google Play | 需在 Data safety 中声明权限用途;Android 13+ 媒体权限需按类型声明 |
| 华为 / 鸿蒙 | 说明 ohos.permission.* 用途;system_basic 权限需 ACL 白名单 |
| 国内 Android 市场 | 隐私合规检测会扫描 manifest 权限列表,确保与隐私政策一致 |
manifest.json 权限或鸿蒙 module.json5 后,需重新打包privacyDescription 后需重新打包,必要时删除旧 App 重装以重新触发授权弹窗本文档说明集成本插件时,各端需要修改哪些文件、如何配置权限,以及插件内置配置文件的作用。
| 平台 | 配置文件 | 配置方 | 说明 |
|---|---|---|---|
| Android | 宿主 manifest.json |
集成者 | 声明 android.permission.* |
| iOS | 宿主 manifest.json |
集成者 | 声明 NS*UsageDescription |
| Harmony | 插件 utssdk/app-harmony/module.json5(可选:harmony-configs/entry/src/main/module.json5) |
插件内置为主,集成者可切换 full 版或宿主覆盖 |
插件负责运行时检查与申请;Android / iOS 的静态声明必须由宿主项目在 manifest 中完成。Harmony 权限由插件 module 合并进宿主包,集成者按需切换 normal / full 版本。
路径:项目根目录 manifest.json
节点:app-plus.distribute.android.permissions
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.RECORD_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.READ_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>",
"<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>",
"<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\"/>"
]
}
}
}
}
| 插件 Key | Android 权限 | 备注 |
|---|---|---|
camera |
CAMERA |
|
photoLibrary |
READ_MEDIA_IMAGES(API 33+)或 READ_EXTERNAL_STORAGE |
插件按 SDK 自动选择 |
storage |
READ_MEDIA_IMAGES + READ_MEDIA_VIDEO(API 33+)或 WRITE/READ_EXTERNAL_STORAGE |
|
readStorage |
同 photoLibrary / 媒体读权限 |
|
location |
ACCESS_FINE_LOCATION |
|
coarseLocation |
ACCESS_COARSE_LOCATION |
|
microphone |
RECORD_AUDIO |
|
contacts |
READ_CONTACTS |
|
writeContacts |
WRITE_CONTACTS |
|
bluetooth |
BLUETOOTH_CONNECT + BLUETOOTH_SCAN(API 31+)或 BLUETOOTH + BLUETOOTH_ADMIN |
|
phone |
CALL_PHONE |
|
phoneState |
READ_PHONE_STATE |
|
sms |
SEND_SMS |
|
readSms |
READ_SMS |
|
receiveSms |
RECEIVE_SMS |
|
overlay |
无 manifest 条目 | 通过 Settings.canDrawOverlays 检查 |
writeSettings |
无 manifest 条目 | 通过 Settings.System.canWrite 检查 |
READ_MEDIA_*;插件仅在 targetSdkVersion >= 33 时动态申请新媒体权限,否则回退 READ_EXTERNAL_STORAGE(兼容 targetSdk 偏低的自定义基座)overlay、writeSettings 需在 manifest 声明对应 capability 后,通过插件跳转系统设置页授权路径:项目根目录 manifest.json
节点:app-plus.distribute.ios.privacyDescription
{
"app-plus": {
"distribute": {
"ios": {
"privacyDescription": {
"NSCameraUsageDescription": "需要使用相机进行拍照",
"NSMicrophoneUsageDescription": "需要使用麦克风进行录音",
"NSPhotoLibraryUsageDescription": "需要访问相册以选择图片",
"NSPhotoLibraryAddUsageDescription": "需要保存图片到相册",
"NSLocationWhenInUseUsageDescription": "需要获取位置信息",
"NSContactsUsageDescription": "需要访问通讯录",
"NSBluetoothAlwaysUsageDescription": "需要使用蓝牙连接周边设备"
}
}
}
}
}
| 插件 Key | Info.plist 键 | 备注 |
|---|---|---|
camera |
NSCameraUsageDescription |
|
photoLibrary |
NSPhotoLibraryUsageDescription |
|
storage |
NSPhotoLibraryUsageDescription 或 NSPhotoLibraryAddUsageDescription |
映射到相册 |
readStorage |
NSPhotoLibraryUsageDescription |
映射到相册 |
location |
NSLocationWhenInUseUsageDescription |
|
coarseLocation |
NSLocationWhenInUseUsageDescription |
与精确定位共用 |
microphone |
NSMicrophoneUsageDescription |
|
contacts |
NSContactsUsageDescription |
|
writeContacts |
NSContactsUsageDescription |
读写共用 |
bluetooth |
NSBluetoothAlwaysUsageDescription |
必须配置,否则 App 设置页无蓝牙开关 |
iOS 蓝牙涉及两个独立概念:
| 概念 | 设置路径 | 配置要求 |
|---|---|---|
| 系统蓝牙开关 | 设置 → 蓝牙 | 无需 manifest,用户手动打开 |
| App 蓝牙授权 | 设置 → 本 App → 蓝牙,或 设置 → 隐私与安全性 → 蓝牙 | 需 NSBluetoothAlwaysUsageDescription + 重新打包 + App 曾触发弹窗 |
Apple 不提供跳转到「隐私 → 蓝牙」的公开深链;插件 openPermissionSettings('bluetooth') 会打开 App 设置页并配合引导文案。
使用 m-permission-manager 时,一般不需要在 harmony-configs/ 里重复声明权限。
鸿蒙端权限有两种配置路径:
| 方式 | 配置文件 | 适用场景 |
|---|---|---|
| UTS 插件声明(推荐) | uni_modules/m-permission-manager/utssdk/app-harmony/module.json5 |
插件打包为鸿蒙子模块(HAR),权限对整个 App 生效 |
| 宿主工程覆盖 | harmony-configs/entry/src/main/module.json5 |
插件未覆盖的权限、或希望在宿主侧集中管理 |
鸿蒙官方规则:已在子模块中声明的权限,主工程无需重复添加,权限在整个应用中生效。
m-permission-manager 作为 UTS 插件,其 module.json5 会在编译时拷贝为插件子模块的 src/main/module.json5,因此默认情况下宿主不必再配。
当前项目的 harmony-configs/ 主要用于:
| 文件 | 用途 |
|---|---|
AppScope/app.json5 |
包名、版本、图标(HX 4.31+ 也可在 manifest.json → app-harmony 图形界面配置) |
build-profile.json5 |
签名证书(.cer / .p12 / .p7b) |
entry/build-profile.json5 |
release 混淆等构建选项 |
entry/obfuscation-rules.txt |
混淆规则 |
若要在 harmony-configs 中配置权限(可选,非必须):
unpackage/dist/dev/app-harmony/entry/src/main/module.json5 复制完整文件到 harmony-configs/entry/src/main/module.json5module.requestPermissions 节点,其他节点不要删(uni-app 是文件级覆盖,不是 JSON 节点合并)集成 m-permission-manager 时,优先改插件内的
module.json5/module.full.json5,而不是 harmony-configs。
目录:uni_modules/m-permission-manager/utssdk/app-harmony/
| 文件 | 权限数量 | APL 等级 | 用途 |
|---|---|---|---|
module.json5 |
5 项 | normal | 默认生效,调试证书可直接安装 |
module.normal.json5 |
5 项 | normal | 与 module.json5 相同,备份参考 |
module.full.json5 |
9 项 | normal + system_basic | 含相册 / 通讯录,需 ACL 签名 |
权限说明文案:resources/base/element/string.json
| 插件 Key | ohos.permission | 说明 |
|---|---|---|
camera |
CAMERA |
|
microphone |
MICROPHONE |
|
location |
LOCATION |
|
coarseLocation |
APPROXIMATELY_LOCATION |
|
bluetooth |
ACCESS_BLUETOOTH |
| 插件 Key | ohos.permission | APL | 说明 |
|---|---|---|---|
photoLibrary / readStorage |
READ_IMAGEVIDEO |
system_basic | 需 ACL |
storage |
WRITE_IMAGEVIDEO |
system_basic | 需 ACL |
contacts |
READ_CONTACTS |
system_basic | 需 ACL |
writeContacts |
WRITE_CONTACTS |
system_basic | 需 ACL |
module.full.json5 的内容覆盖 module.json5| 场景 | 检查 status | 申请结果 |
|---|---|---|
| 相册 / 通讯录等未在 module.json5 声明 | restricted |
9020003,附未声明说明 |
| 系统设置 | 无对应开关 | 引导使用 uni.chooseImage 或切换 full 版本 |
说明 module.json5 中含有未签名的 system_basic 权限。请确认使用默认 5 项 normal 版本;若已合并 full 版本,需先完成 ACL 与 Profile 签名。
以下插件 Key 在鸿蒙返回 unsupported:phone、phoneState、sms、readSms、receiveSms、overlay、writeSettings。
Android manifest:
"permissions": [
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"
]
iOS privacyDescription:
"privacyDescription": {
"NSCameraUsageDescription": "需要使用相机",
"NSMicrophoneUsageDescription": "需要使用麦克风"
}
Harmony:默认 module.json5 已包含,无需修改。
Android manifest 增加:
"<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/>",
"<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>"
iOS privacyDescription 增加:
"NSBluetoothAlwaysUsageDescription": "需要使用蓝牙连接周边设备"
Harmony:默认 module.json5 已包含 ACCESS_BLUETOOTH。
module.full.json5 覆盖 module.json5READ_MEDIA_IMAGES / READ_MEDIA_VIDEONSPhotoLibraryUsageDescription若仅需选图不上传,推荐使用
uni.chooseImage,三端均无需媒体读写权限。
privacyDescription 后建议删除旧 App 重装,以重新触发授权弹窗module.json5 后需重新签名安装面向插件作者,说明如何将本插件提交到 DCloud 插件市场,以及后台各字段的填写参考。
package.json 中 id、version、description、keywords 已填写dcloudext.type 为 utsdcloudext.declaration 中 ads / data / permissions 已如实填写uni_modules.platforms 中各端支持情况准确(vue3=y,H5/小程序=x)readme.md 完整(安装、API、权限、FAQ)使用规范.md、权限配置说明.md、changelog.md 已更新index.d.ts 与 index.js 导出一致BLUETOOTH_CONNECT / BLUETOOTH_SCANREAD_MEDIA_IMAGES 自动映射overlay)、修改系统设置(writeSettings)跳转设置页openPermissionSettings('bluetooth') 引导文案正确module.json5)restricted / 9020003uni_modules/m-permission-manager 目录(或打包 zip)| 字段 | 填写内容 |
|---|---|
| 插件名称 | m-permission-manager 跨端权限管理 |
| 插件 ID | m-permission-manager |
| 插件类型 | UTS 插件 |
| 价格 | 免费(或按实际定价) |
| 版本号 | 与 package.json → version 一致,如 1.0.0 |
m-permission-manager - uni-app 跨端权限管理(Android/iOS/鸿蒙)
UTS 权限插件,Android / iOS / Harmony 三端统一 API,检查与申请运行时权限,支持跳转系统设置。
m-permission-manager 是 uni-app Vue3 跨端权限管理 UTS 插件,支持 Android、iOS、Harmony 三端。
【核心能力】
· 17 种统一权限 Key,三端通用命名
· 同步 / 异步检查权限状态
· 单个 / 批量申请权限
· 按权限类型跳转系统设置页
· 获取当前平台支持的权限列表
【平台支持】
· Android:17 项权限(含悬浮窗、短信、电话等 Android 专属)
· iOS:10 项通用权限(相机、相册、定位、麦克风、蓝牙、通讯录等)
· Harmony:10 项通用权限(默认 5 项 normal 可直接安装,相册/通讯录需 ACL)
【集成方式】
1. 导入 uni_modules 插件
2. 在宿主 manifest.json(Android/iOS)及鸿蒙 module.json5 中声明所需权限
3. 使用 @/utils/permission-manager Promise 封装或直接调用 UTS API
详细权限配置见插件内[权限配置说明](#权限配置说明),集成规范见[使用规范](#使用规范)。
权限, permission, 运行时权限, 蓝牙, 相机, 定位, Android, iOS, Harmony, 鸿蒙, UTS
可直接粘贴以下内容,或填写插件 readme 链接:
【快速开始】
1. 从插件市场导入 m-permission-manager 到项目 uni_modules 目录
2. 在 manifest.json 中声明宿主所需权限(Android permissions / iOS privacyDescription)
鸿蒙端见插件 utssdk/app-harmony/module.json5,详见[权限配置说明](#权限配置说明)
3. 重新制作自定义基座或云打包(UTS 插件不支持标准基座)
4. 在代码中调用:
import {
checkPermission,
requestPermission,
openPermissionSettings,
} from '@/utils/permission-manager'
const result = await checkPermission('camera')
const granted = await requestPermission('camera')
if (!granted) {
await openPermissionSettings('camera')
}
【重要说明】
· 仅支持 App 端(Android / iOS / Harmony),不支持 H5 与小程序
· 插件负责运行时检查与申请,宿主仍需在 manifest 中声明静态权限
· iOS 蓝牙需在 privacyDescription 中配置 NSBluetoothAlwaysUsageDescription
· 鸿蒙相册/通讯录为 system_basic 权限,默认调试包未声明,需 ACL 签名后启用
完整文档:
· [readme](#m-permission-manager) — API 与快速开始
· [使用规范](#使用规范) — 集成约束与推荐流程
· [权限配置说明](#权限配置说明) — 三端权限文件配置详解
dcloudext.declaration 对应项)| 字段 | 填写内容 |
|---|---|
| 是否含广告 | 无 |
| 是否采集数据 | 不上传任何用户数据,仅在本地检查与申请系统权限 |
| 权限说明 | Android:宿主 manifest 声明对应 android.permission.*;iOS:宿主 manifest 声明 NSCameraUsageDescription 等 Info.plist 键;Harmony:插件 module.json5 声明 ohos.permission.*,运行时申请 |
| 平台 | 支持情况 |
|---|---|
| uni-app Vue3 | ✅ |
| uni-app Vue2 | ❌ |
| H5 | ❌ |
| 小程序 | ❌ |
| Android App | ✅(minSdk 23) |
| iOS App | ✅(min iOS 14) |
| Harmony App | ✅(API 12+) |
Q:为什么必须自定义基座?
A:本插件为 UTS 原生插件,标准基座不包含。需制作含本插件的自定义基座或云打包。
Q:H5 能用吗?
A:不支持。仅 App 端(Android / iOS / Harmony)。
Q:安装插件后还需要配置权限吗?
A:需要。Android / iOS 必须在宿主 manifest.json 中声明静态权限与隐私说明;鸿蒙由插件 module.json5 合并,但 ACL 权限需额外签名。详见权限配置说明。
Q:三端权限 Key 一样吗?
A:统一使用 camera、microphone、location、bluetooth 等 Key,插件内部映射到各平台原生权限。部分 Key 仅 Android 支持(如 overlay、sms),调用时会返回 unsupported。
Q:iOS 蓝牙在 App 设置里找不到?
A:需在 manifest 配置 NSBluetoothAlwaysUsageDescription 并重新打包,且 App 需曾触发蓝牙权限弹窗。若 App 设置页无该项,请前往「设置 → 隐私与安全性 → 蓝牙」。系统蓝牙开关在「设置 → 蓝牙」,与应用授权无关。
Q:鸿蒙相册权限申请失败?
A:默认 module.json5 仅含 5 项 normal 权限,未声明相册读写。相册选图推荐 uni.chooseImage;若必须申请媒体权限,需用 module.full.json5 覆盖并配置 ACL 签名。
Q:用户永久拒绝后怎么办?
A:调用 openPermissionSettings(permissionKey) 跳转对应系统设置页,配合 getPermissionSettingsGuide() 展示引导文案。
遵循 语义化版本:
| 变更类型 | 版本 bump | 示例 |
|---|---|---|
| 不兼容 API 变更 | major | 2.0.0 |
| 新增功能(兼容) | minor | 1.1.0 |
| Bug 修复 | patch | 1.0.1 |
每次发版同步更新 package.json → version 和 changelog.md。
发布前请在 package.json → dcloudext.contact.qq 填写维护者 QQ,或在插件市场后台配置联系方式。
targetSdkVersion 与 READ_MEDIA_* / BLUETOOTH_* 不匹配)权限映射同时校验设备 API 与宿主 targetSdkVersion,自定义基座 targetSdk < 33 时回退旧版权限
新增 openPermissionSettings(permission) 按权限类型跳转系统设置
新增 getPermissionSettingsGuide(permission, label) 引导文案
Android:overlay / writeSettings 跳转对应系统设置页
readme 补充 iOS 蓝牙说明与 NSBluetoothAlwaysUsageDescription
@/utils/permission-manager Promise 封装