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

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

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

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

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

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

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

© 2021 V2EX