|
@@ -1,971 +0,0 @@
|
|
|
-# m-permission-manager
|
|
|
|
|
-
|
|
|
|
|
-uni-app Vue3 跨端权限管理 UTS 插件,支持 **Android / iOS / Harmony** 三端,提供统一的权限检查与申请 API。
|
|
|
|
|
-
|
|
|
|
|
-## 功能
|
|
|
|
|
-
|
|
|
|
|
-- 统一权限标识,三端通用
|
|
|
|
|
-- 同步 / 异步检查权限状态
|
|
|
|
|
-- 单个 / 批量申请权限
|
|
|
|
|
-- 跳转系统应用设置页
|
|
|
|
|
-- 获取当前平台支持的权限列表
|
|
|
|
|
-
|
|
|
|
|
-## 安装
|
|
|
|
|
-
|
|
|
|
|
-插件位于 `src/uni_modules/m-permission-manager/`,随项目直接使用,无需额外安装。
|
|
|
|
|
-
|
|
|
|
|
-## 文档
|
|
|
|
|
-
|
|
|
|
|
-> 插件市场仅展示本 readme,下方链接为文内锚点,可直接跳转。
|
|
|
|
|
-
|
|
|
|
|
-| 文档 | 说明 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| [使用规范](#使用规范) | 集成约束、推荐流程、审核注意事项 |
|
|
|
|
|
-| [权限配置说明](#权限配置说明) | Android / iOS / Harmony 三端权限文件配置详解 |
|
|
|
|
|
-| [发布指南](#发布指南) | DCloud 插件市场发布填写参考(插件作者) |
|
|
|
|
|
-| [更新日志](#更新日志) | 版本更新记录 |
|
|
|
|
|
-
|
|
|
|
|
-## 快速开始
|
|
|
|
|
-
|
|
|
|
|
-### 方式一:Promise 封装(推荐)
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-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)
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-### 方式二:直接调用 UTS API(callback 风格)
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-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` | 当前平台不支持 |
|
|
|
|
|
-
|
|
|
|
|
-## API
|
|
|
|
|
-
|
|
|
|
|
-| 方法 | 说明 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| `checkPermissionSync(key)` | 同步检查单个权限 |
|
|
|
|
|
-| `checkPermissionsSync(keys[])` | 同步检查多个权限 |
|
|
|
|
|
-| `checkPermission(options)` | 异步检查单个权限 |
|
|
|
|
|
-| `checkPermissions(options)` | 异步检查多个权限 |
|
|
|
|
|
-| `requestPermission(options)` | 申请单个权限 |
|
|
|
|
|
-| `requestPermissions(options)` | 申请多个权限 |
|
|
|
|
|
-| `openAppSettings(options?)` | 打开系统应用设置 |
|
|
|
|
|
-| `openPermissionSettings(key)` | 按权限类型打开对应设置页(封装层) |
|
|
|
|
|
-| `getSupportedPermissionsSync()` | 获取当前平台支持的权限列表 |
|
|
|
|
|
-
|
|
|
|
|
-## 宿主配置
|
|
|
|
|
-
|
|
|
|
|
-> 完整配置说明见 [权限配置说明](#权限配置说明)。
|
|
|
|
|
-
|
|
|
|
|
-### Android
|
|
|
|
|
-
|
|
|
|
|
-在 `manifest.json` → `app-plus.distribute.android.permissions` 中声明所需权限,例如:
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-"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 的自定义基座)。
|
|
|
|
|
-
|
|
|
|
|
-### iOS
|
|
|
|
|
-
|
|
|
|
|
-在 `manifest.json` → `app-plus.distribute.ios.privacyDescription` 中配置权限说明,例如:
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-"privacyDescription": {
|
|
|
|
|
- "NSCameraUsageDescription": "需要使用相机进行拍照",
|
|
|
|
|
- "NSMicrophoneUsageDescription": "需要使用麦克风进行录音",
|
|
|
|
|
- "NSPhotoLibraryUsageDescription": "需要访问相册以选择图片",
|
|
|
|
|
- "NSLocationWhenInUseUsageDescription": "需要获取位置信息",
|
|
|
|
|
- "NSBluetoothAlwaysUsageDescription": "需要使用蓝牙连接周边设备"
|
|
|
|
|
-}
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-> **iOS 蓝牙说明**:蓝牙授权开关出现在「设置 → 本 App → 蓝牙」(需声明 `NSBluetoothAlwaysUsageDescription` 且 App 曾触发过蓝牙权限弹窗)。若 App 设置页无该项,请前往「设置 → 隐私与安全性 → 蓝牙」。系统蓝牙开关在「设置 → 蓝牙」,与应用授权无关。Apple 不提供跳转到「隐私 → 蓝牙」的公开深链,插件会打开 App 设置页并配合引导文案。
|
|
|
|
|
-
|
|
|
|
|
-### Harmony
|
|
|
|
|
-
|
|
|
|
|
-插件 `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 签名。
|
|
|
|
|
-
|
|
|
|
|
-#### 安装报 9568289 时
|
|
|
|
|
-
|
|
|
|
|
-说明当前 `module.json5` 中仍包含未签名的 system_basic 权限(如 `READ_CONTACTS`)。请确认使用的是默认的 5 项 normal 版本;若已手动合并 `module.full.json5`,需先完成 ACL 白名单与 Profile 签名配置。
|
|
|
|
|
-
|
|
|
|
|
-相册选图场景仍推荐使用系统 **PhotoViewPicker**(`uni.chooseImage`),无需申请媒体读写权限。
|
|
|
|
|
-
|
|
|
|
|
-#### 系统设置里找不到相册权限?
|
|
|
|
|
-
|
|
|
|
|
-默认 `module.json5` 为可安装调试包,**未声明** `READ_IMAGEVIDEO` / `WRITE_IMAGEVIDEO`,因此:
|
|
|
|
|
-
|
|
|
|
|
-- 系统「设置 → 应用 → 本应用 → 权限」中**不会出现**相册/媒体开关
|
|
|
|
|
-- 插件会将相册相关权限标记为 **未声明(restricted)**
|
|
|
|
|
-- 演示页可直接点 **「选图」** 试用,走系统相册选择器,不依赖该权限
|
|
|
|
|
-
|
|
|
|
|
-若业务必须申请媒体读写权限:用 `module.full.json5` 覆盖 `module.json5`,在 AppGallery Connect 配置 ACL 并重新签名安装后,系统设置中才会出现对应权限项。
|
|
|
|
|
-
|
|
|
|
|
-## 错误码
|
|
|
|
|
-
|
|
|
|
|
-| errCode | 说明 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| 9020001 | 当前环境不支持 |
|
|
|
|
|
-| 9020002 | 用户拒绝授权 |
|
|
|
|
|
-| 9020003 | 权限不支持当前平台 |
|
|
|
|
|
-| 9020004 | 打开系统设置失败 |
|
|
|
|
|
-| 9020005 | 权限检查失败 |
|
|
|
|
|
-| 9020006 | 权限申请失败 |
|
|
|
|
|
-
|
|
|
|
|
-## 注意事项
|
|
|
|
|
-
|
|
|
|
|
-1. **H5 不支持**:本插件仅适用于 App(Android / iOS)与 Harmony 端。
|
|
|
|
|
-2. **需自定义基座**:UTS 插件修改后需在 HBuilderX 中重新制作自定义基座或云打包。
|
|
|
|
|
-3. **永久拒绝**:用户选择「不再询问」后,需引导用户通过 `openAppSettings()` 手动开启。
|
|
|
|
|
-4. **特殊权限**:Android 悬浮窗(`overlay`)和系统设置(`writeSettings`)需跳转系统设置页授权,申请结果可能为 `notDetermined`。
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-## 使用规范
|
|
|
|
|
-
|
|
|
|
|
-本文档面向集成本插件的 App 开发者,说明 **必须遵守的约束**、**推荐做法** 和 **上架审核注意事项**。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 1. 基本约束(必须遵守)
|
|
|
|
|
-
|
|
|
|
|
-#### 1.1 用户主动触发
|
|
|
|
|
-
|
|
|
|
|
-`requestPermission` / `requestPermissions` **必须由真实用户手势触发**,例如按钮 `click` / `tap`。
|
|
|
|
|
-
|
|
|
|
|
-```vue
|
|
|
|
|
-<!-- ✅ 正确 -->
|
|
|
|
|
-<button @click="handleRequestCamera">申请相机权限</button>
|
|
|
|
|
-
|
|
|
|
|
-<!-- ❌ 错误:页面 onLoad / onShow 自动批量申请 -->
|
|
|
|
|
-<script setup>
|
|
|
|
|
-onMounted(async () => {
|
|
|
|
|
- await requestPermissions(['camera', 'microphone', 'location']) // 体验差,可能被系统限制
|
|
|
|
|
-})
|
|
|
|
|
-</script>
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-原因:Android / iOS / Harmony 运行时权限弹窗均面向用户明确操作;冷启动批量申请易触发拒绝,且不符合各应用商店审核惯例。
|
|
|
|
|
-
|
|
|
|
|
-#### 1.2 先声明、后申请
|
|
|
|
|
-
|
|
|
|
|
-**仅安装插件不够**,必须在各端配置文件中声明所需权限,否则:
|
|
|
|
|
-
|
|
|
|
|
-| 平台 | 未声明后果 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| Android | `SecurityException`、申请无弹窗或直接失败 |
|
|
|
|
|
-| iOS | 崩溃或无授权弹窗 |
|
|
|
|
|
-| Harmony | 系统设置无对应开关,插件返回 `restricted` 或 9020003 |
|
|
|
|
|
-
|
|
|
|
|
-详细配置见 [权限配置说明](#权限配置说明)。
|
|
|
|
|
-
|
|
|
|
|
-#### 1.3 按需申请
|
|
|
|
|
-
|
|
|
|
|
-只申请业务实际使用的权限。在功能入口处按需 `requestPermission`,不要一次性申请全部权限。
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-// ✅ 审核页
|
|
|
|
|
-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
|
|
|
|
|
- }
|
|
|
|
|
- // 继续业务逻辑
|
|
|
|
|
-}
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-#### 1.4 平台差异处理
|
|
|
|
|
-
|
|
|
|
|
-调用前可通过 `getSupportedPermissions()` 过滤当前平台不支持的 Key,避免向用户展示无效入口。
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-const supported = getSupportedPermissions()
|
|
|
|
|
-const canUseOverlay = supported.includes('overlay') // 仅 Android 为 true
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 2. 推荐集成流程
|
|
|
|
|
-
|
|
|
|
|
-```
|
|
|
|
|
-进入功能页
|
|
|
|
|
- ↓
|
|
|
|
|
-checkPermission(key) ──→ granted → 执行业务
|
|
|
|
|
- ↓ notDetermined / denied
|
|
|
|
|
-用户点击「申请权限」
|
|
|
|
|
- ↓
|
|
|
|
|
-requestPermission(key)
|
|
|
|
|
- ↓
|
|
|
|
|
-系统弹窗 ──→ 拒绝 → getPermissionSettingsGuide + openPermissionSettings
|
|
|
|
|
- ↓ 同意
|
|
|
|
|
-granted → 执行业务
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-#### 2.1 Promise 封装(推荐)
|
|
|
|
|
-
|
|
|
|
|
-项目可复用 `@/utils/permission-manager.js`:
|
|
|
|
|
-
|
|
|
|
|
-```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 })` | 检查 → 申请 → 可选跳转设置 |
|
|
|
|
|
-
|
|
|
|
|
-#### 2.2 直接调用 UTS API(callback 风格)
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-import { requestPermission } from '@/uni_modules/m-permission-manager'
|
|
|
|
|
-
|
|
|
|
|
-requestPermission({
|
|
|
|
|
- permission: 'camera',
|
|
|
|
|
- success(res) {
|
|
|
|
|
- if (res.granted) { /* ... */ }
|
|
|
|
|
- },
|
|
|
|
|
- fail(err) {
|
|
|
|
|
- console.error(err.errCode, err.errMsg)
|
|
|
|
|
- },
|
|
|
|
|
-})
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-#### 2.3 永久拒绝后的引导
|
|
|
|
|
-
|
|
|
|
|
-用户选择「不再询问」或多次拒绝后,应引导至系统设置:
|
|
|
|
|
-
|
|
|
|
|
-```js
|
|
|
|
|
-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 | 系统设置 → 应用详情 |
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 3. 各端特别注意
|
|
|
|
|
-
|
|
|
|
|
-#### 3.1 Android
|
|
|
|
|
-
|
|
|
|
|
-- **Android 13+**:相册 / 存储自动映射 `READ_MEDIA_IMAGES` / `READ_MEDIA_VIDEO`
|
|
|
|
|
-- **Android 12+**:蓝牙自动映射 `BLUETOOTH_CONNECT` / `BLUETOOTH_SCAN`
|
|
|
|
|
-- **特殊权限**:`overlay`、`writeSettings` 需跳转系统设置页,申请结果可能为 `notDetermined`,返回后需再次 `checkPermission`
|
|
|
|
|
-
|
|
|
|
|
-#### 3.2 iOS
|
|
|
|
|
-
|
|
|
|
|
-- 必须在 `privacyDescription` 中配置对应 `NS*UsageDescription`,否则无弹窗
|
|
|
|
|
-- `storage` / `readStorage` 映射到相册权限(`PHPhotoLibrary`)
|
|
|
|
|
-- `coarseLocation` / `location` 均映射到定位授权
|
|
|
|
|
-- **蓝牙**:需 `NSBluetoothAlwaysUsageDescription`;系统蓝牙开关在「设置 → 蓝牙」,App 授权在 App 设置页或「隐私与安全性 → 蓝牙」
|
|
|
|
|
-
|
|
|
|
|
-#### 3.3 Harmony
|
|
|
|
|
-
|
|
|
|
|
-- 默认 `module.json5` 含 5 项 normal 权限,调试包可直接安装
|
|
|
|
|
-- 相册 / 通讯录为 `system_basic`,需 ACL 签名 + `module.full.json5`
|
|
|
|
|
-- 相册选图推荐 `uni.chooseImage`(系统 PhotoViewPicker),无需媒体读写权限
|
|
|
|
|
-- 未声明的 ACL 权限:检查返回 `restricted`,申请返回 9020003
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 4. 错误码与用户提示
|
|
|
|
|
-
|
|
|
|
|
-| errCode | 含义 | 建议提示 |
|
|
|
|
|
-| --- | --- | --- |
|
|
|
|
|
-| 9020001 | 当前环境不支持 | 请在 App 端使用 |
|
|
|
|
|
-| 9020002 | 用户拒绝授权 | 您拒绝了授权,可在设置中重新开启 |
|
|
|
|
|
-| 9020003 | 权限不支持当前平台 | 当前平台不支持该权限 |
|
|
|
|
|
-| 9020004 | 打开系统设置失败 | 无法打开系统设置,请手动前往 |
|
|
|
|
|
-| 9020005 | 权限检查失败 | 权限检查失败,请重试 |
|
|
|
|
|
-| 9020006 | 权限申请失败 | 权限申请失败,请重试 |
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 5. 上架审核注意事项
|
|
|
|
|
-
|
|
|
|
|
-| 市场 | 注意点 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| App Store | 每个 `NS*UsageDescription` 文案需与真实功能一致;不要申请未使用的权限 |
|
|
|
|
|
-| Google Play | 需在 Data safety 中声明权限用途;Android 13+ 媒体权限需按类型声明 |
|
|
|
|
|
-| 华为 / 鸿蒙 | 说明 `ohos.permission.*` 用途;system_basic 权限需 ACL 白名单 |
|
|
|
|
|
-| 国内 Android 市场 | 隐私合规检测会扫描 manifest 权限列表,确保与隐私政策一致 |
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 6. 自定义基座与发版
|
|
|
|
|
-
|
|
|
|
|
-1. 导入或更新插件后,**必须重新制作自定义基座**或云打包
|
|
|
|
|
-2. 修改 `manifest.json` 权限或鸿蒙 `module.json5` 后,需重新打包
|
|
|
|
|
-3. iOS 修改 `privacyDescription` 后需重新打包,必要时删除旧 App 重装以重新触发授权弹窗
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 7. 参考文档
|
|
|
|
|
-
|
|
|
|
|
-- [readme](#m-permission-manager) — API 与快速开始
|
|
|
|
|
-- [权限配置说明](#权限配置说明) — 三端权限文件配置详解
|
|
|
|
|
-- [发布指南](#发布指南) — 插件市场发布填写参考
|
|
|
|
|
-
|
|
|
|
|
-## 权限配置说明
|
|
|
|
|
-
|
|
|
|
|
-本文档说明集成本插件时,**各端需要修改哪些文件**、**如何配置权限**,以及插件内置配置文件的作用。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 1. 配置总览
|
|
|
|
|
-
|
|
|
|
|
-| 平台 | 配置文件 | 配置方 | 说明 |
|
|
|
|
|
-| --- | --- | --- | --- |
|
|
|
|
|
-| **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 版本。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 2. Android 配置
|
|
|
|
|
-
|
|
|
|
|
-#### 2.1 配置文件
|
|
|
|
|
-
|
|
|
|
|
-**路径**:项目根目录 `manifest.json`
|
|
|
|
|
-**节点**:`app-plus.distribute.android.permissions`
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-{
|
|
|
|
|
- "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\"/>"
|
|
|
|
|
- ]
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-#### 2.2 统一 Key 与 Android 权限映射
|
|
|
|
|
-
|
|
|
|
|
-| 插件 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` 检查 |
|
|
|
|
|
-
|
|
|
|
|
-#### 2.3 注意
|
|
|
|
|
-
|
|
|
|
|
-- 只声明业务使用的权限,避免过度申请
|
|
|
|
|
-- Android 13+ 媒体权限使用 `READ_MEDIA_*`;插件仅在 **targetSdkVersion >= 33** 时动态申请新媒体权限,否则回退 `READ_EXTERNAL_STORAGE`(兼容 targetSdk 偏低的自定义基座)
|
|
|
|
|
-- `overlay`、`writeSettings` 需在 manifest 声明对应 capability 后,通过插件跳转系统设置页授权
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 3. iOS 配置
|
|
|
|
|
-
|
|
|
|
|
-#### 3.1 配置文件
|
|
|
|
|
-
|
|
|
|
|
-**路径**:项目根目录 `manifest.json`
|
|
|
|
|
-**节点**:`app-plus.distribute.ios.privacyDescription`
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-{
|
|
|
|
|
- "app-plus": {
|
|
|
|
|
- "distribute": {
|
|
|
|
|
- "ios": {
|
|
|
|
|
- "privacyDescription": {
|
|
|
|
|
- "NSCameraUsageDescription": "需要使用相机进行拍照",
|
|
|
|
|
- "NSMicrophoneUsageDescription": "需要使用麦克风进行录音",
|
|
|
|
|
- "NSPhotoLibraryUsageDescription": "需要访问相册以选择图片",
|
|
|
|
|
- "NSPhotoLibraryAddUsageDescription": "需要保存图片到相册",
|
|
|
|
|
- "NSLocationWhenInUseUsageDescription": "需要获取位置信息",
|
|
|
|
|
- "NSContactsUsageDescription": "需要访问通讯录",
|
|
|
|
|
- "NSBluetoothAlwaysUsageDescription": "需要使用蓝牙连接周边设备"
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-#### 3.2 统一 Key 与 Info.plist 键映射
|
|
|
|
|
-
|
|
|
|
|
-| 插件 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 设置页无蓝牙开关 |
|
|
|
|
|
-
|
|
|
|
|
-#### 3.3 iOS 蓝牙特别说明
|
|
|
|
|
-
|
|
|
|
|
-iOS 蓝牙涉及两个独立概念:
|
|
|
|
|
-
|
|
|
|
|
-| 概念 | 设置路径 | 配置要求 |
|
|
|
|
|
-| --- | --- | --- |
|
|
|
|
|
-| 系统蓝牙开关 | 设置 → 蓝牙 | 无需 manifest,用户手动打开 |
|
|
|
|
|
-| App 蓝牙授权 | 设置 → 本 App → 蓝牙,或 设置 → 隐私与安全性 → 蓝牙 | 需 `NSBluetoothAlwaysUsageDescription` + 重新打包 + App 曾触发弹窗 |
|
|
|
|
|
-
|
|
|
|
|
-Apple 不提供跳转到「隐私 → 蓝牙」的公开深链;插件 `openPermissionSettings('bluetooth')` 会打开 App 设置页并配合引导文案。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 4. Harmony 配置
|
|
|
|
|
-
|
|
|
|
|
-#### 4.1 harmony-configs 要不要配?
|
|
|
|
|
-
|
|
|
|
|
-**使用 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 中配置权限**(可选,非必须):
|
|
|
|
|
-
|
|
|
|
|
-1. 先运行一次鸿蒙编译,从 `unpackage/dist/dev/app-harmony/entry/src/main/module.json5` 复制完整文件到 `harmony-configs/entry/src/main/module.json5`
|
|
|
|
|
-2. **仅修改** `module.requestPermissions` 节点,其他节点不要删(uni-app 是**文件级覆盖**,不是 JSON 节点合并)
|
|
|
|
|
-3. 不要与插件已声明的权限重复
|
|
|
|
|
-
|
|
|
|
|
-> 集成 m-permission-manager 时,优先改插件内的 `module.json5` / `module.full.json5`,而不是 harmony-configs。
|
|
|
|
|
-
|
|
|
|
|
-#### 4.2 插件内置文件
|
|
|
|
|
-
|
|
|
|
|
-**目录**:`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`
|
|
|
|
|
-
|
|
|
|
|
-#### 4.3 默认 module.json5(5 项 normal)
|
|
|
|
|
-
|
|
|
|
|
-| 插件 Key | ohos.permission | 说明 |
|
|
|
|
|
-| --- | --- | --- |
|
|
|
|
|
-| `camera` | `CAMERA` | |
|
|
|
|
|
-| `microphone` | `MICROPHONE` | |
|
|
|
|
|
-| `location` | `LOCATION` | |
|
|
|
|
|
-| `coarseLocation` | `APPROXIMATELY_LOCATION` | |
|
|
|
|
|
-| `bluetooth` | `ACCESS_BLUETOOTH` | |
|
|
|
|
|
-
|
|
|
|
|
-#### 4.4 module.full.json5 额外 4 项(system_basic,需 ACL)
|
|
|
|
|
-
|
|
|
|
|
-| 插件 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 |
|
|
|
|
|
-
|
|
|
|
|
-#### 4.5 如何切换 full 版本
|
|
|
|
|
-
|
|
|
|
|
-1. 将 `module.full.json5` 的内容**覆盖** `module.json5`
|
|
|
|
|
-2. 在 AppGallery Connect 配置 ACL 白名单
|
|
|
|
|
-3. 使用正式 Profile 重新签名打包
|
|
|
|
|
-4. 重新制作自定义基座或云打包
|
|
|
|
|
-
|
|
|
|
|
-#### 4.6 未声明 ACL 权限时的插件行为
|
|
|
|
|
-
|
|
|
|
|
-| 场景 | 检查 status | 申请结果 |
|
|
|
|
|
-| --- | --- | --- |
|
|
|
|
|
-| 相册 / 通讯录等未在 module.json5 声明 | `restricted` | 9020003,附未声明说明 |
|
|
|
|
|
-| 系统设置 | 无对应开关 | 引导使用 `uni.chooseImage` 或切换 full 版本 |
|
|
|
|
|
-
|
|
|
|
|
-#### 4.7 安装报 9568289
|
|
|
|
|
-
|
|
|
|
|
-说明 `module.json5` 中含有未签名的 system_basic 权限。请确认使用默认 5 项 normal 版本;若已合并 full 版本,需先完成 ACL 与 Profile 签名。
|
|
|
|
|
-
|
|
|
|
|
-#### 4.8 鸿蒙不支持的功能
|
|
|
|
|
-
|
|
|
|
|
-以下插件 Key 在鸿蒙返回 `unsupported`:`phone`、`phoneState`、`sms`、`readSms`、`receiveSms`、`overlay`、`writeSettings`。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 5. 配置示例(按业务场景)
|
|
|
|
|
-
|
|
|
|
|
-#### 5.1 仅需相机 + 麦克风
|
|
|
|
|
-
|
|
|
|
|
-**Android** manifest:
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-"permissions": [
|
|
|
|
|
- "<uses-permission android:name=\"android.permission.CAMERA\"/>",
|
|
|
|
|
- "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>"
|
|
|
|
|
-]
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-**iOS** privacyDescription:
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-"privacyDescription": {
|
|
|
|
|
- "NSCameraUsageDescription": "需要使用相机",
|
|
|
|
|
- "NSMicrophoneUsageDescription": "需要使用麦克风"
|
|
|
|
|
-}
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-**Harmony**:默认 `module.json5` 已包含,无需修改。
|
|
|
|
|
-
|
|
|
|
|
-#### 5.2 需要蓝牙
|
|
|
|
|
-
|
|
|
|
|
-**Android** manifest 增加:
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-"<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/>",
|
|
|
|
|
-"<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>"
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-**iOS** privacyDescription 增加:
|
|
|
|
|
-
|
|
|
|
|
-```json
|
|
|
|
|
-"NSBluetoothAlwaysUsageDescription": "需要使用蓝牙连接周边设备"
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-**Harmony**:默认 `module.json5` 已包含 `ACCESS_BLUETOOTH`。
|
|
|
|
|
-
|
|
|
|
|
-#### 5.3 需要相册读写(Harmony 完整权限)
|
|
|
|
|
-
|
|
|
|
|
-1. 用 `module.full.json5` 覆盖 `module.json5`
|
|
|
|
|
-2. 配置 ACL 签名
|
|
|
|
|
-3. Android 增加 `READ_MEDIA_IMAGES` / `READ_MEDIA_VIDEO`
|
|
|
|
|
-4. iOS 增加 `NSPhotoLibraryUsageDescription`
|
|
|
|
|
-
|
|
|
|
|
-> 若仅需选图不上传,推荐使用 `uni.chooseImage`,三端均无需媒体读写权限。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 6. 配置后必做
|
|
|
|
|
-
|
|
|
|
|
-1. **重新制作自定义基座**或云打包(UTS 插件 + manifest 变更均须重新打包)
|
|
|
|
|
-2. iOS 修改 `privacyDescription` 后建议删除旧 App 重装,以重新触发授权弹窗
|
|
|
|
|
-3. Harmony 切换 `module.json5` 后需重新签名安装
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 7. 相关文档
|
|
|
|
|
-
|
|
|
|
|
-- [readme](#m-permission-manager) — API 与权限 Key 对照表
|
|
|
|
|
-- [使用规范](#使用规范) — 集成流程与审核注意事项
|
|
|
|
|
-- [发布指南](#发布指南) — 插件市场发布填写参考
|
|
|
|
|
-
|
|
|
|
|
-## 发布指南
|
|
|
|
|
-
|
|
|
|
|
-面向插件作者,说明如何将本插件提交到 DCloud 插件市场,以及后台各字段的填写参考。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 发布前检查清单
|
|
|
|
|
-
|
|
|
|
|
-#### 代码与文档
|
|
|
|
|
-
|
|
|
|
|
-- [ ] `package.json` 中 `id`、`version`、`description`、`keywords` 已填写
|
|
|
|
|
-- [ ] `dcloudext.type` 为 `uts`
|
|
|
|
|
-- [ ] `dcloudext.declaration` 中 ads / data / permissions 已如实填写
|
|
|
|
|
-- [ ] `uni_modules.platforms` 中各端支持情况准确(vue3=y,H5/小程序=x)
|
|
|
|
|
-- [ ] `readme.md` 完整(安装、API、权限、FAQ)
|
|
|
|
|
-- [ ] `使用规范.md`、`权限配置说明.md`、`changelog.md` 已更新
|
|
|
|
|
-- [ ] `index.d.ts` 与 `index.js` 导出一致
|
|
|
|
|
-
|
|
|
|
|
-#### 功能验证
|
|
|
|
|
-
|
|
|
|
|
-- [ ] Android 真机:相机 / 麦克风 / 定位 / 蓝牙申请与检查
|
|
|
|
|
-- [ ] Android 12+ 真机:蓝牙 `BLUETOOTH_CONNECT` / `BLUETOOTH_SCAN`
|
|
|
|
|
-- [ ] Android 13+ 真机:相册 `READ_MEDIA_IMAGES` 自动映射
|
|
|
|
|
-- [ ] Android 真机:悬浮窗(`overlay`)、修改系统设置(`writeSettings`)跳转设置页
|
|
|
|
|
-- [ ] iOS 14+ 真机:相机 / 麦克风 / 定位 / 蓝牙 / 相册
|
|
|
|
|
-- [ ] iOS 真机:拒绝后 `openPermissionSettings('bluetooth')` 引导文案正确
|
|
|
|
|
-- [ ] Harmony API 12+ 真机:5 项 normal 权限申请(默认 `module.json5`)
|
|
|
|
|
-- [ ] Harmony 真机:相册 ACL 未声明时返回 `restricted` / 9020003
|
|
|
|
|
-- [ ] 拒绝授权时引导跳转系统设置
|
|
|
|
|
-- [ ] H5 环境明确不可用(9020001)
|
|
|
|
|
-
|
|
|
|
|
-#### 打包验证
|
|
|
|
|
-
|
|
|
|
|
-- [ ] 自定义基座可正常运行
|
|
|
|
|
-- [ ] 云打包 / 本地打包正式包可正常运行
|
|
|
|
|
-- [ ] 修改 UTS 代码后已重新制作基座
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 提交到插件市场
|
|
|
|
|
-
|
|
|
|
|
-1. 登录 [DCloud 插件市场](https://ext.dcloud.net.cn/)
|
|
|
|
|
-2. 进入 **我的插件** → **发布插件**
|
|
|
|
|
-3. 插件类型选择 **UTS 插件**
|
|
|
|
|
-4. 上传 `uni_modules/m-permission-manager` 目录(或打包 zip)
|
|
|
|
|
-5. 按下方表格填写市场展示信息
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 市场后台填写参考
|
|
|
|
|
-
|
|
|
|
|
-#### 基本信息
|
|
|
|
|
-
|
|
|
|
|
-| 字段 | 填写内容 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| **插件名称** | 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.*,运行时申请 |
|
|
|
|
|
-
|
|
|
|
|
-#### 平台支持(与 package.json 一致)
|
|
|
|
|
-
|
|
|
|
|
-| 平台 | 支持情况 |
|
|
|
|
|
-| --- | --- |
|
|
|
|
|
-| uni-app Vue3 | ✅ |
|
|
|
|
|
-| uni-app Vue2 | ❌ |
|
|
|
|
|
-| H5 | ❌ |
|
|
|
|
|
-| 小程序 | ❌ |
|
|
|
|
|
-| Android App | ✅(minSdk 23) |
|
|
|
|
|
-| iOS App | ✅(min iOS 14) |
|
|
|
|
|
-| Harmony App | ✅(API 12+) |
|
|
|
|
|
-
|
|
|
|
|
-#### 截图建议(4–6 张)
|
|
|
|
|
-
|
|
|
|
|
-1. 权限演示页截图(三端权限列表与状态)
|
|
|
|
|
-2. Promise 封装调用代码示例
|
|
|
|
|
-3. Android 系统权限弹窗(相机 / 蓝牙)
|
|
|
|
|
-4. iOS 隐私授权弹窗
|
|
|
|
|
-5. manifest.json 权限配置示例
|
|
|
|
|
-6. 三端权限支持对照表
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 市场 FAQ 预填
|
|
|
|
|
-
|
|
|
|
|
-**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()` 展示引导文案。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 版本号规范
|
|
|
|
|
-
|
|
|
|
|
-遵循 [语义化版本](https://semver.org/lang/zh-CN/):
|
|
|
|
|
-
|
|
|
|
|
-| 变更类型 | 版本 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,或在插件市场后台配置联系方式。
|
|
|
|
|
-
|
|
|
|
|
----
|
|
|
|
|
-
|
|
|
|
|
-### 参考链接
|
|
|
|
|
-
|
|
|
|
|
-- [UTS 插件开发文档](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html)
|
|
|
|
|
-- [插件市场发布流程](https://uniapp.dcloud.net.cn/plugin/publish.html)
|
|
|
|
|
-- 插件内 [readme](#m-permission-manager)
|
|
|
|
|
-- 插件内 [使用规范](#使用规范)
|
|
|
|
|
-- 插件内 [权限配置说明](#权限配置说明)
|
|
|
|
|
-
|
|
|
|
|
-## 更新日志
|
|
|
|
|
-
|
|
|
|
|
-### 1.0.2(2026-06-17)
|
|
|
|
|
-- 修复 Android:相册/存储/蓝牙申请失败(`targetSdkVersion` 与 `READ_MEDIA_*` / `BLUETOOTH_*` 不匹配)
|
|
|
|
|
-- 权限映射同时校验设备 API 与宿主 `targetSdkVersion`,自定义基座 targetSdk < 33 时回退旧版权限
|
|
|
|
|
-### 1.0.1(2026-06-17)
|
|
|
|
|
-
|
|
|
|
|
-- 新增 `openPermissionSettings(permission)` 按权限类型跳转系统设置
|
|
|
|
|
-- 新增 `getPermissionSettingsGuide(permission, label)` 引导文案
|
|
|
|
|
-- Android:`overlay` / `writeSettings` 跳转对应系统设置页
|
|
|
|
|
-- 新增 [发布指南](#发布指南)、[使用规范](#使用规范)、[权限配置说明](#权限配置说明) 文档
|
|
|
|
|
-- readme 补充 iOS 蓝牙说明与 `NSBluetoothAlwaysUsageDescription`
|
|
|
|
|
-
|
|
|
|
|
-### 1.0.0(2026-05-29)
|
|
|
|
|
-
|
|
|
|
|
-- 初始版本
|
|
|
|
|
-- 支持 Android / iOS / Harmony 三端统一权限检查与申请
|
|
|
|
|
-- 提供同步 / 异步 API 及 `@/utils/permission-manager` Promise 封装
|
|
|