Cordova IOS 应用程序,失去价值使用 window.localStorage 存储

Posted

技术标签:

【中文标题】Cordova IOS 应用程序,失去价值使用 window.localStorage 存储【英文标题】:Cordova IOS app, loosing value Stored using window.localStorage 【发布时间】:2015-09-24 12:16:46 【问题描述】:

应用概述: 我们有两个(ios Cordova 和 IOS 本机)工作应用程序,我们计划将这两个应用程序与现有技术堆栈集成。我们通过在 cocoapods 的帮助下将 Cordova 应用程序转换为二进制文件并将其集成到 IOS 原生应用程序中成功地进行了集成,应用程序功能运行良好。

在 IOS 原生应用中,我们有多个 webview。

问题:在 Cordova 应用程序中,有时我们会丢失使用“window.localStorage”保存的数据,此问题并不一致,但在 10 次尝试中会发生 2 或 3 次。

上述问题仅在应用程序的集成版本(Cordova + Native)中出现,而不在 Cordova 应用程序的独立版本中出现。

我们在集成版本(android native + Cordova android)中遇到了同样的问题,我们设法通过使用“addjavascriptInterface”覆盖“windows.localstorage”来解决这个问题

问题: 1)有没有人经历过本地存储价值的损失。 2)我们是否也有适用于 IOS 的此类选项(即“addJavascriptInterface”),如果有,请您解释一下如何或您能建议一些其他更好的选项来在 Cordova webview 到本机层之间通勤

注意:这种从 Cordova webview 到本地 IOS 的通勤应该是同步的不是异步的,因为我需要覆盖“windows.localstorage” 使用cordova 3.6.3版

提前致谢

【问题讨论】:

【参考方案1】:

从 iOS 5 开始,本地存储不再是持久的。 localstorage 的文件保存在目录 .../Library/Caches 中,如果系统空间非常低,操作系统可能会删除该目录。有关 iOS 中文件系统的更多信息,请参阅:File System Programming Guide

根据cordova的文档,他们提到数据丢失是本地存储的一个缺点:"iOS stores localStorage data in a location that may be cleaned out by the OS when space is required."

因此,如果您的空间不足,数据丢失不是错误。

由于这个问题,我们也在寻找本地存储的替代方案。

经过研究,我发现了一个plugin 专门针对这个问题。该插件使用 NSUserDefaults (iOS) 和 SharedPreferences (Android) 来永久存储数据。这实际上是我对这个问题的首选解决方案。

解决这个问题的其他方法,经常被建议是:

将值存储在位于持久目录中的文件中。此解决方案应该适用于所有具有文件插件的平台。 使用 sqlLite。有许多插件可以提供此功能。

【讨论】:

【参考方案2】:

我在某些设备上也遇到过同样的问题。在我们使用的十几个模型中,有一个存在类似问题。我在本地存储中存储了 6 个对象(字符串),并且在这些设备上 一些 对象在意外时刻可能会变为空。

在挖掘 *** 之后,我发现了一些类似的案例,这些案例并不能明确地回答这个问题。例如,他们报告说:

localStorage cleared on app restart with Cordova 1.7 and iOS 5.1.1 — 如果关闭应用程序,可能无法保存存储空间 Complete data loss Ionic / Cordova LocalStorage and Websql iOS 8.4.1 — 设备空间不足时可能会清除存储空间 https://***.com/questions/27816556/cordova-windows-phone-localstorage-clear-on-app-update — 应用更新时可能会清除存储空间 还有一些参考资料表明某些版本的 PhoneGap 可能会导致此问题。

所以,我还没有答案。

我自己的计划——使用文件或 SqlLite。我确信使用 FileAPI 存储的文件在那里并且不会丢失。

【讨论】:

【参考方案3】:

在深入研究该问题后,我们设法发现本地存储文件已损坏,导致持久数据丢失。

对我们有用的解决方案是:我们开始通过 iOS 的本机层备份本地存储文件。在我们的应用程序中,只有当用户从 Native 堆栈导航到混合堆栈时,我们才会遇到这个问题,因为 Native 堆栈将始终是用户事务的起点。

注意:我们已将 Cordova 应用程序 (Cocoapods) 集成到本机应用程序中。

【讨论】:

以上是关于Cordova IOS 应用程序,失去价值使用 window.localStorage 存储的主要内容,如果未能解决你的问题,请参考以下文章

用angularjs在cordova上失去焦点()

Select2标记输入失去价值AngularJS

Android - 在横向和纵向模式之间切换使 Intent 失去价值

单击以打开 JComboBox 时,JTable 单元格失去价值

如何使用cordova-plugin-file在cordova应用程序之间共享数据? (安卓、IOS)

指向失去价值的对象向量的指针