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

288 天前
 playground
7106 次点击
所在节点    Android
15 条回复
ZZ74
288 天前
因为安卓应用跑在一个虚拟机啊,重启了就是整个虚拟机都销毁了啊。。w
N9f8Pmek6m8iRWYe
288 天前
是的,在 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
288 天前
这种标准问题,gpt 就解决了,没必要发个帖子
playground
288 天前
@N9f8Pmek6m8iRWYe 我使用 GPT4, 并没有解决我的问题, 才会发帖询问
codehz
288 天前
setDomStorageEnabled 开了吗
playground
288 天前
@codehz setDomStorageEnabled/setJavaScriptEnabled/setDatabaseEnabled 都开了, 我新建一个项目, 是可以缓存的, 现在接手的项目不知道哪里导致的不能缓存
ZGame
287 天前
@playground 对 js 做下原生桥接, 对接下 sp ,或者 sqlite 应该没啥大问题
codehz
287 天前
可能是因为有多个 webview 同时存在导致的问题,试试这个项目

https://github.com/didimoo/AndroidLocalStorage
jifengg
287 天前
如果特性都开了,那么检查一下 webview 初始化的时候是否清理了缓存。有可能之前的开发为了避免缓存问题,启动的时候统一清理了。
playground
287 天前
@ZGame js 桥接机制有, 我理解你的意思是通过 js 桥接 原生层面来做缓存么, 现在是 h5 做了 indexedDB 缓存, app 重启导致 indexedDB 被清空, h5 本身的机制失效了, 如果能解决这个问题是成本最小的
ZGame
287 天前
@playground 嗯 我觉得这样实现成本很低
playground
287 天前
@ZGame 但是桥接只能传输字符串吧, h5 内部通过 indexedDB 还要缓存图片文件等
playground
287 天前
@jifengg 我新建了一个 webview, 全部重新设置, 也是一样的效果, 我怀疑有什么统一的配置或机制导致了, 在这个项目中 webview 都不能持久化缓存
playground
287 天前
@codehz 确实有多个 webview, 我排查一下
ZGame
287 天前
@playground base64 加解密就行啊...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1023411

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX