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 回调,但此时应用可能已处于临时清理状态。

解决方案:

  1. 使用同步存储前检查状态:在 fail 回调中,先通过 uni.getStorageInfoSync() 检查存储状态,再读取具体键值。
  2. 提前持久化关键数据:在调用定位前,将必要参数通过 uni.setStorageSync 保存,避免依赖内存缓存。
  3. 添加容错机制:在 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');
  }
});
回到顶部