uni-app ermissionExternalStorage设置为always,用户拒绝后会一直导致在开屏页卡住
uni-app ermissionExternalStorage设置为always,用户拒绝后会一直导致在开屏页卡住
permissionExternalStorage设置为always,用户拒绝,再勾选拒绝且不再询问后,跳转到设置界面,此时不做任何设置,杀掉app,重新打开app,页面卡在开屏页,没有任务提示。怎么解决呢
有很多人和我一样的遭遇,问题帖子: https://ask.dcloud.net.cn/article/36549#externalstorage
1 回复
在处理 uni-app
中 permissionExternalStorage
设置为 always
时用户拒绝权限请求导致应用卡住的问题,我们需要确保应用在用户拒绝权限后能够有合理的降级处理机制,而不是无限期地卡住开屏页。以下是一个处理这种情况的代码示例,通过使用条件判断和异步请求权限的方式来实现。
首先,确保你的 manifest.json
文件中已经声明了存储权限:
"mp-weixin": { // 以微信小程序为例,其他平台类似
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序存储功能"
}
// 注意:这里的scope.userLocation仅为示例,实际应为存储相关权限描述,但微信小程序不直接管理存储权限,需通过用户授权文件访问
}
}
然后,在你的 uni-app
项目中,可以使用以下代码逻辑来处理权限请求和拒绝的情况:
// 假设在开屏页(splash.vue)中进行权限请求
export default {
mounted() {
this.requestStoragePermission();
},
methods: {
async requestStoragePermission() {
try {
// 注意:uni-app没有直接的always权限设置API,这里模拟请求存储权限的逻辑
// 实际应根据你的平台(如Android、iOS)使用相应的原生插件或API
const hasPermission = await uni.getSetting({
success: (res) => {
return res.authSetting['scope.writePhotosAlbum'] || false; // 示例权限,实际应替换为存储权限
}
});
if (!hasPermission) {
uni.authorize({
scope: 'scope.writePhotosAlbum', // 示例权限,替换为实际存储权限
success: () => {
// 用户同意授权,继续执行后续操作
this.navigateToMainPage();
},
fail: () => {
// 用户拒绝授权,执行降级处理
uni.showModal({
title: '提示',
content: '您拒绝了存储权限,某些功能可能无法正常使用。',
showCancel: false,
success: (res) => {
if (res.confirm) {
// 跳转到主页面或其他无需该权限的页面
this.navigateToMainPageWithoutPermission();
}
}
});
}
});
} else {
// 已经有权限,直接跳转
this.navigateToMainPage();
}
} catch (error) {
console.error('请求权限失败:', error);
// 处理请求权限失败的情况,如跳转到错误页面或重试逻辑
}
},
navigateToMainPage() {
uni.navigateTo({
url: '/pages/main/main'
});
},
navigateToMainPageWithoutPermission() {
uni.navigateTo({
url: '/pages/main/mainNoPermission' // 跳转到无需该权限的页面
});
}
}
}
上述代码在开屏页加载时请求存储权限,如果用户拒绝,则显示提示信息并跳转到无需该权限的页面,从而避免应用卡住。注意,uni-app
本身不直接管理所有平台的权限,对于特定平台(如Android、iOS),可能需要使用原生插件或相应平台的API来实现更细粒度的权限管理。