uniapp移动端获取不到Storage如何解决?

第一次做移动端,本来想再请求头赋token,但发现一直没值,现在单独写了一个点击事件发现,h5端页面调试页存储和拿取没有问题,拿手机测就取不到值,这是为啥?

img

img

移动端嵌入h5页面打开APP后, 获取不到我存储的token

img

是在手机app中不行吗?试试看把对象转为JSON.stringify(obj)再存储

参考GPT和自己的思路,根据您提供的代码,我看到您使用了 uni.setStorageSync 和 uni.getStorageSync 来在本地缓存中存储和获取 token。在移动端,有时候由于缓存策略和安全性限制,可能会导致在获取缓存数据时出现问题。

有几种方法可以尝试解决这个问题:

请确保您使用的是最新版本的 uni-app,以避免已知的缓存问题。
请尝试在获取 token 时,将其打印到控制台,以确保您能够成功获取 token。如果打印出了 token 值,那么问题可能出在缓存方面。
请尝试使用异步的方式获取 token,这样您就可以确保在获取 token 后才执行下一步操作,例如:

applyCerth(){
  getToken().then(res => {
    uni.setStorageSync("mytoken", res.data.msg)
    const uniToken = uni.getStorageSync("mytoken")
    this.$u.toast(uniToken);
    // 在这里执行下一步操作
  }).catch(error => {
    console.log(error);
    // 处理错误情况
  });
}

如果您仍然无法获取到缓存中的 token,您可能需要调查缓存策略和安全性限制的问题。
如果对您有帮助,请给与采纳,谢谢。

以下答案基于ChatGPT与GISer Liu编写:

  • 可能是因为移动端的存储机制不同于浏览器中的LocalStorage和SessionStorage。移动端可以使用uni-app提供的一些原生存储方式,例如uni.getStorageSync和uni.setStorageSync,用法和LocalStorage和SessionStorage类似,但是存储的数据会存储在本地的应用缓存中,而不是浏览器的本地缓存中。所以,你可以尝试使用uni.getStorageSync和uni.setStorageSync来代替LocalStorage和SessionStorage。另外,如果你需要跨页面使用数据,可以考虑使用uni-app提供的vuex状态管理机制。

有没有可能拿手机测的时候接口报错了

可能是Storage Key的名称写错或者内存满了

你看看使用这个思路:uni-app跳转(传参)+设置获取缓存
提供参考实例:链接:https://code84.com/848307.html

在使用uni-app开发移动端应用时,有时候可能会出现获取不到Storage的问题,可能是因为以下原因:
第一:在uni-app中,Storage分为两种,一种是本地缓存localStorage,另一种是会话缓存sessionStorage。其中,localStorage是长期存储,即使关闭页面或者应用也不会丢失数据,而sessionStorage是会话级别的缓存,关闭页面或应用后会丢失数据。因此,如果是使用sessionStorage进行缓存,可能会出现获取不到Storage的问题。
第二:uni-app中的Storage是基于WebView实现的,如果WebView的版本过低,可能会出现获取不到Storage的问题。
第三:如果在uni-app的manifest.json文件中禁用了Storage模块,也可能会导致获取不到Storage的问题。
为了解决这些问题,可以采取以下方法:
检查是否是使用了sessionStorage进行缓存,如果是,可以改用localStorage来进行缓存。
检查WebView的版本是否过低,如果是,可以尝试升级WebView版本。
检查manifest.json文件是否禁用了Storage模块,如果是,可以将Storage模块启用。
在使用Storage时,最好先判断是否支持Storage,避免出现获取不到Storage的问题。可以使用以下代码进行判断:

if (window.localStorage) {
  // 支持localStorage
} else {
  // 不支持localStorage
}

如果以上方法都没有解决问题,可以尝试清除缓存或者重启应用,有时候可能是缓存或者应用状态导致的问题。

在uniapp中,可以使用uni.getStorageSync(key)来获取缓存数据,其中key是缓存数据的键值。如果该函数返回值为空,则表示该键值对应的缓存数据不存在。如果你发现在移动端获取不到缓存数据,可以尝试以下几种解决方法:

1.检查是否设置了缓存数据
确保在设置缓存数据时,使用的是uni.setStorageSync(key, data)函数,并且该函数没有报错。如果设置缓存数据时报错了,可能是因为key值不合法或者存储空间已满等原因导致。

2.检查是否设置了Storage权限
在移动端获取缓存数据时,需要先获取Storage权限。在uni-app的manifest.json文件中,可以添加如下配置:

"app-plus": {
    "name": "uni-app",
    "permissions": {
        "storage": {
            "description": "允许访问存储空间"
        }
    }
}


3.检查是否使用了异步缓存方法
在移动端,使用异步的缓存方法uni.setStorage和uni.getStorage可能会出现数据获取不到的情况。建议使用同步的缓存方法uni.setStorageSync和uni.getStorageSync。

4.检查是否清除了缓存数据
如果在移动端使用uni.removeStorageSync(key)函数清除了缓存数据,那么该数据就不存在了,因此无法获取到。

在uni-app中,采用使用Storage模块,来来辅助存储、访问关键数据,移动端时,有时候获取到的Storage是null,有可能是Storage的bug引起的,可以尝试以下方法解决:

  1. 克制住不要在同一个页面之间频繁地读写Storage。
  2. 想要在同一个页面包括组件之间读写Storage时,尽量不要在onLoad/onShow回调中读写Storage,尽量在Pages下的onUnload回调中来读写Storage。
  3. 读写Storage时,不要使用async/await方式读写Storage,这种方式很容易被更底层的webview拦住,当然,这也不是一定的。
  4. 在小程序等渠道运行时,可以先读取数据,然后存储到Store中,在客户端读取Store中的数据。这样可以避免Storage获取不到的问题。
  5. 控制Storage存储字段数正常时,可以提高Storage的稳定性。

原因是因为移动端和web端存储位置上有所不同,存储在web端可以正常获取,而移动端则需要在uni.setStorageSync中使用绝对路径来获取和存储数据,比如uni.setStorageSync('homePages/index/index', 'token'),其中的homePages/index/index为相对于项目的绝对路径,需要传入相关路径后才可以正常获取token值。此外,移动端获取存储的token的时候,也需要穿入同样的绝对路径,例如: uni.getStorageSync('homePages/index/index')。