uni.getsetting在app端返回空或不准确,因ios未申请时返回{}、android返回{authsetting:{}},且无法区分“未申请”“拒绝”“永久拒绝”三种状态,故不可单独依赖,须结合原生api检测。

uni.getSetting 为什么返回空或不准确
在 App 端,uni.getSetting 对权限状态的反映非常不可靠:iOS 在未请求过某权限时返回空对象 {},Android 则返回 { authSetting: {} };两者都容易被误判为“已拒绝”。更关键的是,它不区分「从未申请」「用户点拒绝但没勾选‘不再询问’」「用户点了拒绝且勾选‘不再询问’」这三种完全不同的状态。
实操建议:
- 绝不能单独依赖
uni.getSetting做权限判断,尤其不能用它来决定是否调用uni.authorize - 首次检测前,先用
plus.android.requestPermissions(Android)或AVCaptureDevice.authorizationStatusForMediaType(iOS)做原生级探针 - 对 iOS 的
scope.locationAlways等后台权限,uni.getSetting根本不返回对应字段,必须走plus.ios调用
Android 后台定位权限怎么真正检测
Android 10+ 的 ACCESS_BACKGROUND_LOCATION 权限不会出现在 uni.getSetting().authSetting 中,即使用户已授权,uni.getSetting 也查不到。这是系统限制,不是 uni-app bug。
实操建议:
- 先用
plus.android.checkPermission('android.permission.ACCESS_BACKGROUND_LOCATION')主动查原生状态 - 若返回
false,再调用plus.android.requestPermissions发起申请(注意:该权限需和前台定位权限分开申请) - manifest.json 中必须同时声明
ACCESS_FINE_LOCATION和ACCESS_BACKGROUND_LOCATION,否则打包后直接无法调用 - 不要尝试用
uni.authorize({ scope: 'scope.locationBackground' })—— 这个 scope 在 App 端根本不存在,会静默失败
iOS 相机/麦克风权限被“永久拒绝”后怎么识别
iOS 用户一旦在系统弹窗中点击「不允许」并勾选「不再询问」,后续调用 uni.authorize({ scope: 'scope.camera' }) 会直接进 fail 回调,且 uni.getSetting 仍返回空对象,没有任何提示字段说明是“永久拒绝”。
实操建议:
- 必须用
plus.ios走原生路径:AVCaptureDevice.authorizationStatusForMediaType('vide')返回值为3表示已授权,2表示用户拒绝(含“不再询问”),0表示未申请 - 对麦克风同理,用
AVAudioSession.sharedInstance().recordPermission(),返回0是未申请,1是已授权,2是拒绝 - 检测到
2时,应立即引导用户跳转设置页:uni.openSetting(),不能再尝试uni.authorize
通知权限在 Android 13+ 怎么避免假阳性
Android 13(API 33)起新增 POST_NOTIFICATIONS 权限,而旧版 Android 的 uni.getPushPermission 在未申请时也常返回 { state: 'granted' },造成“明明没开通知却显示已授权”的假阳性。
实操建议:
- 先用
uni.getSystemInfoSync().SDKVersion判断是否 ≥"33" - ≥33:必须调用
uni.authorize({ scope: 'scope.notification' }),捕获fail并提示用户手动开启 - plus.android.checkPermission('android.permission.POST_NOTIFICATIONS') 补充验证(注意:低版本此权限名无效,需 try/catch)
-
uni.getPushPermission仅作辅助参考,绝不用于 UI 渲染判断











