uni-app 系统权限弹窗弹出点禁止后(未勾选不再显示),弹两次后(品牌不一样弹出次数不一样)不再弹出,但检查权限状态返回undetermined
uni-app 系统权限弹窗弹出点禁止后(未勾选不再显示),弹两次后(品牌不一样弹出次数不一样)不再弹出,但检查权限状态返回undetermined
示例代码:
系统权限弹窗弹出点禁止后(未勾选不再显示),弹两次后(品牌不一样弹出次数不一样)不再弹出,但检查权限状态返回undetermined,
当不再弹窗后
plus.navigator.checkPermission("CONTACTS")还是返回的undetermined
操作步骤:
系统权限弹窗弹出点禁止后(未勾选不再显示),弹两次后(品牌不一样弹出次数不一样)不再弹出,但检查权限状态返回undetermined,
当不再弹窗后
plus.navigator.checkPermission("CONTACTS")还是返回的undetermined
如调用plus.device.getInfo()
预期结果:
plus.navigator.checkPermission("CONTACTS")返回状态表示当前不会再弹出权限框
实际结果:
plus.navigator.checkPermission("CONTACTS")返回undetermined状态 但最开始的几下会弹窗权限确认框,后面不弹权限缺框了,无法判断下一次是否弹权限框
bug描述:
系统权限弹窗弹出点禁止后(未勾选不再显示),弹两次后(品牌不一样弹出次数不一样)不再弹出,但检查权限状态返回undetermined,
当不再弹窗后
plus.navigator.checkPermission("CONTACTS")还是返回的undetermined
无法判断下一次是否弹权限框
1 回复
在 uni-app
中,系统权限弹窗的行为和表现可能会因设备品牌和系统版本的不同而有所差异。你提到的情况是,当用户点击禁止权限后(未勾选“不再显示”),弹窗弹出两次后不再弹出,但检查权限状态返回 undetermined
(未确定)。这种情况通常是由于以下原因导致的:
1. 系统权限弹窗的默认行为
- 安卓系统:安卓系统在处理权限请求时,通常允许应用多次请求权限。如果用户未选择“不再显示”选项,系统会在用户拒绝权限后仍然允许应用再次请求权限。但是,某些设备品牌(如小米、华为等)可能会对权限请求进行额外的限制,导致弹窗弹出次数有限。
- iOS系统:iOS系统在用户拒绝权限后,通常不会再次弹出权限请求弹窗,除非用户手动去系统设置中更改权限。
2. undetermined
状态的原因
- 当你检查权限状态时,返回
undetermined
表示系统尚未确定用户是否授予了权限。这通常发生在以下情况:- 用户未明确授予或拒绝权限:如果用户没有明确选择“允许”或“禁止”,系统可能会返回
undetermined
。 - 权限请求被系统中断:某些设备品牌可能会在用户拒绝权限后,中断权限请求流程,导致权限状态无法正确更新。
- 权限请求未完成:如果权限请求未完成(例如用户未做出选择或系统中断了请求),权限状态可能仍然为
undetermined
。
- 用户未明确授予或拒绝权限:如果用户没有明确选择“允许”或“禁止”,系统可能会返回
3. 解决方案
- 引导用户手动开启权限:如果用户拒绝了权限,并且系统不再弹出权限请求弹窗,你可以在应用中提示用户手动去系统设置中开启权限。可以通过
uni-app
提供的 API 跳转到系统设置页面:uni.openSetting({ success: (res) => { console.log(res.authSetting); } });
- 检查权限状态:在请求权限之前,先检查权限状态,如果权限状态为
undetermined
或denied
,可以提示用户开启权限或引导用户去设置页面。uni.getSetting({ success: (res) => { if (!res.authSetting['scope.userLocation']) { // 权限未开启,提示用户或引导去设置页面 } } });
- 处理权限请求失败的情况:在请求权限时,处理用户拒绝权限的情况,并提供友好的提示信息。
uni.authorize({ scope: 'scope.userLocation', success: () => { // 权限请求成功 }, fail: (err) => { if (err.errMsg.includes('denied')) { // 用户拒绝了权限,提示用户或引导去设置页面 } } });