uni.authorize在app端无效,因它是为小程序设计的api,在android/ios上仅静默返回失败;真正拦截需基于uni.getsetting状态判断+用户动线干预,并区分首次拒绝与永久拒绝。

App端权限申请不能靠 uni.authorize 拦截,它在 Android/iOS 上基本不弹窗、只返回 fail: { errMsg: "authorize:fail auth deny" };真正有效的拦截必须基于状态检测 + 用户动线干预,且需区分首次拒绝和永久拒绝。
为什么 uni.authorize 在 App 端根本拦不住权限申请
uni.authorize 是为小程序设计的 API,在 App 环境下只是个空壳:调用后不触发系统弹窗,也不改变权限状态,仅同步返回失败。官方文档没明说,但实测所有主流厂商(华为、小米、OPPO)均如此。
- Android:调用
uni.authorize({ scope: 'scope.userLocation' })后,fail回调立刻触发,errMsg固定为"authorize:fail auth deny" - iOS:同样静默失败,且对
scope.locationAlways等后台权限完全无响应——这些字段压根不会出现在uni.getSetting()的返回里 - 后果:写
uni.getLocation().catch(() => uni.authorize(...))这类兜底逻辑,纯属无效重试
真正可拦截的时机:在调用 getLocation 前做 getSetting 状态判断
权限是否能弹窗,只取决于 uni.getSetting() 返回的 authSetting['scope.userLocation'] 值,且必须在 uni.getLocation 之前调用——Android 端若跳过这步直接调 getLocation,会静默进 fail,连错误码都不给。
-
undefined:首次未询问 → 可安全调uni.getLocation(系统自动弹窗) -
true:已授权 → 直接调uni.getLocation -
false:已拒绝 → 此时再调uni.authorize无效,必须走引导流程 - 注意:华为/小米部分机型返回
false即代表“永久拒绝”,别指望还能再弹一次
用户拒绝后怎么引导?不能一拒就跳 openSetting
uni.openSetting 会跳转到系统设置页,但华为应用市场明确禁止“因拒绝强制跳转”——审核被拒高频原因就是没加确认弹窗。
- 必须先用
uni.showModal做轻量交互,文案要含三要素:权限名称 + 具体功能 + 使用场景,例如:“需要访问位置,才能推荐附近门店和实时导航” -
confirmText写“去设置”,cancelText写“稍后再说”,仅在用户点“去设置”后才调uni.openSetting - 调
uni.openSetting后无法监听用户是否真开启了权限,建议清空当前页面缓存或提示“返回后重试” - iOS 上
uni.openSetting只能打开总设置页,无法跳转到具体权限项;Android 厂商定制系统(如 EMUI)也可能屏蔽深度跳转
绕不开的原生层补漏:getSetting 不可靠时怎么办
uni.getSetting 在 App 端返回极不可靠:iOS 未申请时返回空对象 {},Android 返回 { authSetting: {} },两者都容易被误判为“已拒绝”。它更无法区分「从未申请」「点拒绝但没勾选‘不再询问’」「勾选‘不再询问’后永久拒绝」。
- 对 Android 后台定位权限
ACCESS_BACKGROUND_LOCATION:uni.getSetting根本查不到,必须用plus.android.checkPermission('android.permission.ACCESS_BACKGROUND_LOCATION') - 对 iOS 相机/麦克风永久拒绝:
uni.getSetting仍返回空对象,得用原生 API:AVCaptureDevice.authorizationStatusForMediaType('vide')返回2表示拒绝(含“不再询问”) - manifest.json 中必须声明对应权限,否则
plus.android.requestPermissions也调不起;iOS 还需在info.plist配NSLocationWhenInUseUsageDescription等描述字段
最易被忽略的一点:不同权限在不同平台的检测路径完全不同,比如定位前台权限可用 getSetting,后台定位就得走 plus.android.checkPermission,相机在 iOS 上必须用 AVCaptureDevice——没有统一入口,只能按权限类型逐个适配。











