uni-app权限配置需三步:manifest.json声明(Android用android.permission.前缀、iOS填NS*UsageDescription、鸿蒙需module.json5显式声明)、运行时调用API、各平台描述文案齐全,缺一导致静默失败或审核被拒。

uni-app 打包权限配置不是“配了就自动生效”,而是分三步走:manifest.json 声明、运行时调用 API 请求、iOS/Android/HarmonyOS 各平台描述文案缺一不可。漏掉任一环,真机上要么静默失败,要么弹窗被拒,且控制台几乎不报错。
manifest.json 里 Android 权限必须带 android.permission. 前缀
只写 CAMERA 或 camera 是无效的;HBuilderX 不报错,但打包后在 Android 6.0+ 上系统直接忽略该权限请求,plus.android.requestPermissions 回调中 deniedAlways 可能为空,误判成“用户没点”,实际是系统压根没认这个权限名。
- 正确写法:
"android.permission.CAMERA"、"android.permission.ACCESS_FINE_LOCATION"、"android.permission.READ_EXTERNAL_STORAGE" - Android 10+ 需额外注意:
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE配合requestLegacyExternalStorage=true(仅调试期),正式版应迁移到 Scoped Storage - 云端打包时若同时使用
AndroidManifest.xml自定义权限,需确保与manifest.json中声明不冲突,否则打包日志会提示 merge error
iOS 权限描述文案必须填进 NS*UsageDescription 字段
苹果审核强制要求——没有对应描述文案,权限申请会被系统拦截,uni.authorize 直接返回 fail,无任何提示。
- 必须写在
"app-plus"→"permissions"下,例如:"NSPhotoLibraryUsageDescription": "用于从相册选择图片" - 常见字段包括:
NSCameraUsageDescription、NSLocationWhenInUseUsageDescription、NSMicrophoneUsageDescription - 老版本 HBuilderX 可能要求写在
"distribute"→"ios"下,新项目统一推荐用permissions路径 - 文案不能留空或只写英文占位符,App Store 审核可能因此拒审
微信小程序隐私接口必须精准匹配 requiredPrivateInfos
不是“开了相册权限就能调所有相册 API”,而是每个接口单独登记。漏一个,真机上调用就静默失败,errCode: -1,控制台不打印任何错误信息。
- 只用
uni.chooseImage?那就只填"chooseImage" - 还用了
uni.getLocation和uni.chooseLocation?必须三个都列:["getLocation", "chooseLocation", "chooseImage"] - 字段名大小写敏感,不能写成
getlocation或getlocation - 该配置在
manifest.json的"mp-weixin"节点下,不是全局配置
鸿蒙(HarmonyOS)需手动添加 ohos.permission.* 权限
uni-app 打包为鸿蒙 APP 时,manifest.json 的权限声明对鸿蒙无效。必须在生成的鸿蒙工程(app-harmony)中修改 module.json5 文件,显式声明鸿蒙权限。
- 例如相机权限要加:
"ohos.permission.CAMERA";位置权限加:"ohos.permission.LOCATION" - 鸿蒙权限名和 Android 不互通,不能复用
android.permission.* - 部分 API(如
uni.scanCode)在鸿蒙端依赖ohos.permission.DISTRIBUTED_DATASYNC,不加则扫码失败 - 调试证书和发布证书的包名必须一致,否则权限配置不生效
最容易被忽略的是:权限在 manifest.json 里只是“备案”,真正触发弹窗的是运行时那行 uni.authorize 或 plus.android.requestPermissions;而 iOS 和鸿蒙的描述文案一旦漏填或拼错,连弹窗机会都没有——它根本不会走到请求那步。


















