uni-app无获取完整权限列表API,需分层处理:JS层用uni.getSetting查scope三态,原生层Android用plus.android.hasPermission检测真实permission,iOS只能功能试探。
uni-app 没有提供获取「当前 app 已申请或已授予的权限列表」的 api,uni.getsetting 只返回用户对各 scope 的授权状态(true/false/undefined),不包含 android/ios 原生权限(如 android.permission.camera)的运行时授予情况。所谓“权限列表”,实际要分两层理解:js 层 scope 状态、原生层 permission 状态——二者不互通,也不能互相推导。
uni.getSetting 返回的不是权限列表,而是 scope 授权三态
uni.getSetting 的 res.authSetting 对象只包含 uni-app 抽象出的 scope 键值对,例如 'scope.userLocation'、'scope.writePhotosAlbum'。它不反映底层是否真的拿到了 ACCESS_FINE_LOCATION 或 PHOTO_LIBRARY_ADD_ONLY 这类系统级权限。
- Android 上即使 manifest.json 声明了
RECORD_AUDIO且用户在系统设置里开了麦克风权限,uni.getSetting也不会暴露这个事实——它只管自己封装的scope.recordAudio(该 scope 实际未被官方支持,需自行映射) - iOS 同理:
PHOTO_LIBRARY开关状态无法通过任何 uni API 读取,uni.getSetting里只有scope.writePhotosAlbum,且它的false可能来自用户拒绝授权,也可能是系统因隐私策略静默拦截 - 不存在
scope.xxx对应的原生权限,调用uni.getSetting不会触发任何 native 权限检查,也不会抛错,只是查 JS 缓存
Android 原生权限状态必须用 plus.android 获取
若需确认某项 Android 原生权限(如相机、定位)是否真正被授予,必须调用 plus.android API,且仅限 App 平台:
-
plus.android.hasPermission('android.permission.CAMERA')—— 返回true表示系统已授予权限(注意:不是 scope,是真实 permission) -
plus.android.hasPermission('android.permission.ACCESS_FINE_LOCATION')在 Android 12+ 需配合ACCESS_COARSE_LOCATION一起检查,否则可能误判 - 该方法不触发弹窗,也不需要
manifest.json额外配置,但要求真机调试或自定义基座;云打包的标准基座因未集成 plus 模块,调用会直接报undefined is not a function - 不能批量查询:每次只能传一个权限字符串,没有类似
getPermissionsList()的接口
iOS 没有等效的运行时权限检查机制
iOS 上无法通过任何公开 API 查询某个原生权限(如 NSCameraUsageDescription 对应的实际开关)是否开启。Apple 明确禁止第三方 App 读取系统权限状态,这是隐私沙盒强制要求。
-
uni.getSetting中的scope.camera为false,只说明用户拒绝过 uni 封装的授权请求,不代表系统级摄像头权限关闭(可能用户手动在设置里打开了,但 uni 仍记为 false) -
plus.ios没有hasPermission类方法,尝试反射调用AVCaptureDevice.authorizationStatus(for: .video)属于私有 API,App Store 审核必拒 - 唯一可行路径是「功能试探」:调用
uni.chooseImage或uni.startRecord,根据 fail 回调的errCode和errMsg间接判断(如errCode: -1+"no permission"),但不可靠,且会触发系统弹窗
别试图拼凑“完整权限列表”,业务只需关心关键几个 scope
现实中几乎不需要知道“App 拥有哪些权限”,而应聚焦于「当前功能是否可用」。比如上传图片,只须检查 scope.writePhotosAlbum;扫码,只须检查 scope.camera。强行枚举所有权限既无标准接口,又易踩平台限制雷区。
Android 端若真需批量验证,可写原生插件遍历 PackageManager 的 checkPermission 调用,但需逐个传入权限名,且 iOS 侧完全不可行——这意味着跨平台代码必然断裂。最稳妥的做法,是把权限检查下沉到具体功能入口,按需触发,而不是启动时就拉一张“权限清单”。


















