uni-app 安装应用后进入无授权选项直接弹出授权提示弹窗 设置里允许权限后仍弹出
uni-app 安装应用后进入无授权选项直接弹出授权提示弹窗 设置里允许权限后仍弹出
类别 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC版本号 | Windows 11 家庭中文版 23H2 |
HBuilderX | 正式 |
HBuilderX版本 | 4.31 |
手机系统 | Android |
手机版本号 | Android 14 |
手机厂商 | realme |
手机机型 | RMX3366 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
操作步骤:
设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。
预期结果:
设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。
实际结果:
设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。
bug描述:
设置targetSdkVersion值为34。 在realme手机上:安装应用后进入应用,没有授权选项,直接弹出需要授权的提示弹窗,在设置里把所有权限都设置为允许后,还是弹出需要授权的提示弹窗。 另一台小米手机上:安装应用后进入应用,弹窗授权,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任何提示。
你可以打包一个空项目,运行在你的realme和小米上,有问题吗?
如果没问题,再排查是你的代码还是你用的三方插件调用了。
你也可以找应用商店要权限调用堆栈,看看是谁申请了这个本地文件权限。
在处理 uni-app 中权限授权的问题时,我们需要确保在用户未授权时弹出授权提示,并在用户授权后不再重复弹出。这通常涉及到检查权限状态、请求权限以及处理权限结果的逻辑。以下是一个示例代码,展示了如何在 uni-app 中实现这一功能。
首先,确保你已经在 manifest.json
中声明了需要的权限,例如相机和存储权限:
"mp-weixin": {
"requiredPrivateInfos": ["getUserInfo", "getPhoneNumber"]
},
"plus": {
"distribute": {
"android": {
"permissions": [
"android.permission.CAMERA",
"android.permission.WRITE_EXTERNAL_STORAGE"
]
},
"ios": {
"plist": [
"NSCameraUsageDescription",
"NSPhotoLibraryUsageDescription"
]
}
}
}
然后,在你的页面或组件中,使用以下代码逻辑来检查和请求权限:
export default {
onLoad() {
this.checkPermissions();
},
methods: {
checkPermissions() {
const permissions = ['camera', 'writeExternalStorage']; // 根据需要添加更多权限
permissions.forEach(permission => {
if (!this.hasPermission(permission)) {
this.requestPermission(permission).then(res => {
if (res.authResult === 'grant') {
console.log(`${permission} 权限已授权`);
} else {
console.log(`${permission} 权限未授权`);
// 可以在这里显示一个提示,引导用户去设置中授权
uni.showModal({
title: '提示',
content: `${permission} 权限未授权,请前往设置授权`,
showCancel: false,
success: function (res) {
if (res.confirm) {
uni.openSetting();
}
}
});
}
}).catch(err => {
console.error(err);
});
}
});
},
hasPermission(permission) {
return plus.android.checkPermission(permission) === plus.android.PERMISSION_GRANTED ||
uni.getSettingInfoSync().authSetting[permission] === true;
},
requestPermission(permission) {
return new Promise((resolve, reject) => {
if (plus.os.name === 'Android') {
plus.android.requestPermissions([permission], (event) => {
const authResult = event.deniedAlways.indexOf(permission) === -1 ? 'grant' : 'deny';
resolve({ authResult });
}, (e) => {
reject(e);
});
} else {
uni.authorize({
scope: permission,
success: (res) => {
resolve({ authResult: 'grant' });
},
fail: (err) => {
resolve({ authResult: 'deny' });
}
});
}
});
}
}
};
这个示例代码在 onLoad
生命周期中调用 checkPermissions
方法,该方法会遍历所有需要检查的权限。如果权限未授权,则调用 requestPermission
方法请求权限,并根据授权结果进行相应的处理。注意,对于 Android 和 iOS 平台,权限请求的方式有所不同,因此需要根据平台进行判断。