uni-app 获取手机定位权限失败后会自动清理缓存参数 导致无法获取已缓存的参数
uni-app 获取手机定位权限失败后会自动清理缓存参数 导致无法获取已缓存的参数
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:windows 10
HBuilderX类型:正式
HBuilderX版本号:3.1.13
手机系统:iOS
手机系统版本号:IOS 14
手机厂商:苹果
手机机型:iphone 12
页面类型:vue
打包方式:云端
示例代码:
// 获取当前定位
uni.setStorageSync('test',1)
uni.getLocation({
success(res) {
// console.log("地址",res)
uni.setStorageSync('isadd',1)//表示获取所在地成功
// console.log(uni.getStorageSync('islogin'))
console.log(uni.getStorageSync('test'))
resole(res)
},
fail(res){
uni.clearStorageSync('isadd')//删除表示失败
console.log(uni.getStorageSync('test'))// 已经登录存储了test 参数。但是在这里获取为空
console.log('获取当前位置出错',res)
resole(res)
}
})
操作步骤:
运行示例代码
预期结果:
不允许进入fail()同样能获取到缓存参数
实际结果:
缓存都获取不到了。被自动清理掉了。
bug描述:
app获取定位信息点击不允许, 返回权限验证失败信息中获取缓存 unigetStorageSync(),都获取不到,此后在其他页面缓存参数都不再能获取到,像是被自动清理了一样。必须要重新写入。 然而如果同意权限就不会有问题。 不知道是bug还是特性,如果是特性。那应该不太合理。如果是bug 还希望快些修改。
更多关于uni-app 获取手机定位权限失败后会自动清理缓存参数 导致无法获取已缓存的参数的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
嗯。问题找到了。我还是有点年轻。嗯 。。。话说怎么没办法删除文章。搞得我有点尴尬。
更多关于uni-app 获取手机定位权限失败后会自动清理缓存参数 导致无法获取已缓存的参数的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在 uni-app 中,定位权限被拒绝后无法获取已缓存数据的问题,通常是由于系统权限弹窗触发时应用状态变化导致的。这并非 uni-app 框架的 bug,而是 iOS 系统权限机制与 uni-app 生命周期交互的结果。
当用户拒绝定位权限时,iOS 系统会中断当前应用的部分运行状态,可能导致内存中的缓存数据被重置。uni.getLocation 在权限拒绝后会触发 fail 回调,但此时应用可能已处于临时清理状态。
解决方案:
- 使用同步存储前检查状态:在
fail回调中,先通过uni.getStorageInfoSync()检查存储状态,再读取具体键值。 - 提前持久化关键数据:在调用定位前,将必要参数通过
uni.setStorageSync保存,避免依赖内存缓存。 - 添加容错机制:在
fail回调中重新初始化关键数据,或使用try-catch包裹存储操作。
示例修改:
uni.setStorageSync('test', 1);
uni.getLocation({
success(res) {
uni.setStorageSync('isadd', 1);
console.log(uni.getStorageSync('test')); // 正常
},
fail(res) {
// 检查存储状态
const storageInfo = uni.getStorageInfoSync();
if (storageInfo.keys.includes('test')) {
console.log(uni.getStorageSync('test')); // 可获取
} else {
uni.setStorageSync('test', 1); // 重新初始化
}
uni.removeStorageSync('isadd');
}
});

