uni-app 退出重启后 getStorageSync 获取不到值

uni-app 退出重启后 getStorageSync 获取不到值

开发环境 版本号 项目创建方式
Mac macOS big sur(11) HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

PC开发环境操作系统版本号:macOS big sur(11)

HBuilderX类型:正式

HBuilderX版本号:3.1.1

手机系统:全部

页面类型:vue

打包方式:云端

项目创建方式:HBuilderX

测试过的手机:Android手机

示例代码:
/**
 * @description 存储本地数据
 * @param {Object} key
 * @param {Object} value
 */
setStorage(key,value){  
    try {  
        uni.setStorageSync(key, JSON.stringify(value || {}));  
    } catch (e) {  
        uni.setStorageSync(key, null);  
    }  
},  

/**
 * @description 获取本地数据
 * @param {Object} key
 */
getStorage(key){  
    try {  
        let value = uni.getStorageSync(key) || {};  
        if (value) {  
            return JSON.parse(value);  
        }  
    } catch (e) {  
        return null;  
    }  
},
操作步骤:
使用uni.getStorageSync获取缓存数据
预期结果:
可以获取数据
实际结果:
偶发性获取不到
bug描述:
业务逻辑: 把登录成功后的用户信息存入缓存,关闭App,下次启动检测是否存在此缓存。
但是Android手机是偶发性获取不到。仔细检查的确没有清空缓存的操作,要是清空的话,每次启动都得不到,而现在是偶发性的。已经有3个客户反映出现此问题了。(正式的发行包)
真机运行自定义基座时,uni.getStorageSync读取已经登录并存储了用户信息,也是偶发性获取不到。但是比正式发行包几率要高些。
目前是实在找不到确切的问题在那里,故无法提供demo。但的确出现使用uni.setStorageSync获取不到缓存信息的问题!
tips:之前项目时mui 5+App项目使用的是localStorage存储的,客户反映良好。(uni.setStorageSync在App端应该对应的是plus.storage.setItem),不知道为什么会是这样

更多关于uni-app 退出重启后 getStorageSync 获取不到值的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

该问题仍然存在,我已反馈至你们iOS技术:FlowerRain,请尽快修复!

更多关于uni-app 退出重启后 getStorageSync 获取不到值的实战教程也可以访问 https://www.itying.com/category-93-b0.html


2023年7月18日16:34:29
IQOO手机,依旧问题存在。偶发性的获取不到配置地址。

出现问题的机型信息补充一下

iOS模拟器 - iPhone 14 Pro - iOS14.6 上也存在类似问题,热重载的时候能获取到数据,但是每次重新运行项目就获取不到缓存,缓存消失了。

这个问题在红米k50机型上依然存在,红米手机完全获取不到存储后的值,存储的值只能当前页面存取,跨页面获取不到内容

之前我也是遇到了这个问题,使用 uni.getStorageSync 获取不到数据 ,然后用其他方式搞定了,最开始还以为是其他BUG

怎么解决的,可以借鉴一下吗大佬

小米14也会这样

这是一个典型的uni-app存储数据丢失问题,主要可能由以下几个原因导致:

  1. 存储时机问题:
  • 在App启动时过早调用getStorageSync可能导致读取失败
  • 建议在onLaunch生命周期后再读取存储
  1. Android平台特性:
  • Android系统可能在内存不足时自动清理存储
  • 部分厂商ROM会限制后台应用的存储访问
  1. 序列化问题:
  • 你的代码中对空值处理不够严谨
  • 建议修改getStorage方法为:
getStorage(key){
    try {
        const value = uni.getStorageSync(key);
        return value ? JSON.parse(value) : null;
    } catch (e) {
        return null;
    }
}
回到顶部