V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
playground
V2EX  ›  Android

我不擅长 android 开发, 问一个关于 webview 的问题, 在 h5 中使用 localstorage, indexedDB, 在应用存活期间, 是可以持久化的, 为什么 app 重启了之后, 就读不到了呢, 感谢解答

  •  
  •   playground · 273 天前 · 6832 次点击
    这是一个创建于 273 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  272 天前
    目前排查进度: 并不是缓存失效, 而是每次启动都生成了新的 webview 缓存目录, 在 cache 目录下有多个 webview_为前缀的目录, 这有可能是什么原因导致的呢, 我在其他项目中只有一个 webview 目录. 有 api 可以改动这个么
    第 2 条附言  ·  271 天前
    问题解决更新:
    项目中有这样一行代码 WebView.setDataDirectorySuffix(Process.myPid() + "");
    每次 app 启动会生成新的缓存目录导致的, 由于知识盲区导致排查花费了一些时间.
    15 条回复    2024-03-14 14:05:34 +08:00
    ZZ74
        1
    ZZ74  
       273 天前 via Android
    因为安卓应用跑在一个虚拟机啊,重启了就是整个虚拟机都销毁了啊。。w
    N9f8Pmek6m8iRWYe
        2
    N9f8Pmek6m8iRWYe  
       273 天前
    是的,在 Android 应用程序中使用 WebView 时,`localStorage`和`IndexedDB`的行为应该与在标准浏览器中相同。它们都是用于在客户端持久化存储数据的技术,即使在应用程序重启后,数据也应该保持不变。如果数据在应用程序重启后丢失,可能是由于以下原因:

    1. **WebView 配置**:如果 WebView 没有正确配置,或者应用程序的某些设置导致 WebView 在重启时清除了数据。

    2. **应用程序的清理机制**:某些 Android 应用程序可能会有自己的清理机制,这可能会影响到 WebView 中的数据持久化。

    3. **存储空间限制**:`localStorage`通常有 5MB 的存储限制,而`IndexedDB`可以使用更多的存储空间,但如果用户的设备存储空间不足,可能会影响数据的持久化。

    4. **应用程序的权限**:应用程序可能需要特定的权限来保证数据的持久化,如果没有这些权限,数据可能无法保存。

    5. **浏览器缓存策略**:不同的 Android 版本和浏览器可能有不同的缓存策略,这可能会影响到数据的持久化。

    为了确保数据能够在应用程序重启后仍然可用,开发者需要确保 WebView 和应用程序的设置都支持数据持久化,并且要考虑到不同设备和浏览器版本之间的兼容性问题。¹²³

    源: 与必应的对话,2024/3/13
    (1) How to use IndexedDB to Store Local Data for your Web App. https://dev.to/alexeagleson/how-to-use-indexeddb-to-store-data-for-your-web-application-in-the-browser-1o90.
    (2) A complete guide to using IndexedDB - LogRocket Blog. https://blog.logrocket.com/using-indexeddb-complete-guide/.
    (3) 浏览器缓存库设计总结( localStorage/indexedDB ) - 知乎. https://zhuanlan.zhihu.com/p/120761426.
    N9f8Pmek6m8iRWYe
        3
    N9f8Pmek6m8iRWYe  
       273 天前
    这种标准问题,gpt 就解决了,没必要发个帖子
    playground
        4
    playground  
    OP
       273 天前
    @N9f8Pmek6m8iRWYe 我使用 GPT4, 并没有解决我的问题, 才会发帖询问
    codehz
        5
    codehz  
       273 天前
    setDomStorageEnabled 开了吗
    playground
        6
    playground  
    OP
       273 天前
    @codehz setDomStorageEnabled/setJavaScriptEnabled/setDatabaseEnabled 都开了, 我新建一个项目, 是可以缓存的, 现在接手的项目不知道哪里导致的不能缓存
    ZGame
        7
    ZGame  
       273 天前
    @playground 对 js 做下原生桥接, 对接下 sp ,或者 sqlite 应该没啥大问题
    codehz
        8
    codehz  
       273 天前 via iPhone
    可能是因为有多个 webview 同时存在导致的问题,试试这个项目

    https://github.com/didimoo/AndroidLocalStorage
    jifengg
        9
    jifengg  
       273 天前
    如果特性都开了,那么检查一下 webview 初始化的时候是否清理了缓存。有可能之前的开发为了避免缓存问题,启动的时候统一清理了。
    playground
        10
    playground  
    OP
       273 天前
    @ZGame js 桥接机制有, 我理解你的意思是通过 js 桥接 原生层面来做缓存么, 现在是 h5 做了 indexedDB 缓存, app 重启导致 indexedDB 被清空, h5 本身的机制失效了, 如果能解决这个问题是成本最小的
    ZGame
        11
    ZGame  
       273 天前
    @playground 嗯 我觉得这样实现成本很低
    playground
        12
    playground  
    OP
       273 天前
    @ZGame 但是桥接只能传输字符串吧, h5 内部通过 indexedDB 还要缓存图片文件等
    playground
        13
    playground  
    OP
       273 天前
    @jifengg 我新建了一个 webview, 全部重新设置, 也是一样的效果, 我怀疑有什么统一的配置或机制导致了, 在这个项目中 webview 都不能持久化缓存
    playground
        14
    playground  
    OP
       273 天前
    @codehz 确实有多个 webview, 我排查一下
    ZGame
        15
    ZGame  
       273 天前
    @playground base64 加解密就行啊...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3203 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:41 · PVG 18:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.