iOS 7 webview 和 localStorage 持久化
Posted
技术标签:
【中文标题】iOS 7 webview 和 localStorage 持久化【英文标题】:iOS 7 webview and localStorage persistence 【发布时间】:2014-10-26 23:46:02 【问题描述】:我正在使用 PhoneGap/Cordova 开发一个混合应用程序(仅适用于 ios 和 android),并希望使用 html5 localStorage 来存储内容以供离线访问。
http://caniuse.com/#search=localStorage 说 - “在 iOS 5 和 6 中,localStorage 数据存储在操作系统偶尔可能会清除的位置。”
iOS 7(及更高版本)webview 的情况如何,localStorage 在什么情况下会持续存在或被清除(由操作系统或用户)?
应用程序的更新是否会清除 localStorage?
用户在 Safari 上清除浏览器历史记录的情况如何 - 这也适用于 webview?
我是否需要担心(或者我什至可以控制)在 fils 系统上的哪个位置创建 localStorage。我知道它不应该在 iCloud 上备份。
我有一个设备 (iPad) 并检查文件系统,我发现 localStorage 文件位于应用沙箱内的 ~/Library/Caches 中,见下图。
来自文档:
https://developer.apple.com/icloud/documentation/data-storage/index.html 可以再次下载或重新生成的数据应存储在 /Library/Caches 目录中。您应该放在 Caches 目录中的文件示例包括数据库缓存文件和可下载内容,例如杂志、报纸和地图应用程序使用的内容。
我这样做只是为了设置数据:
localStorage.setItem('foo','this is the FOO value');
localStorage.setItem('bar','and this is the BAR value');
【问题讨论】:
可能重复。看看***.com/a/39097517/6237235 【参考方案1】:如果您使用的是cordova,这个问题很久以前就已经解决了,即使是iOS 5 和iOS 6。如果您使用的是最新版本的cordova,您不必担心。
【讨论】:
您好,谢谢 - 请问您有更多信息的链接吗?我可以做 localStorage.setItem('foo','FOO value');还是我需要插件等? 我没有链接,我只是关注cordova开发,很久以前就读到这个了。它应该在 cordova 或 phonegap 博客上,他们会在其中发布每个版本的更改,但我不记得修复了这个问题的版本。或者你可以尝试在cordova jira上搜索 我没有链接,但我已经查看了几次代码,我可以验证这个问题是否已修复(并且已经修复了一段时间)。随意使用 localStorage。 (如果您的目标是 WP7/8,我会选择setItem
,否则您可以使用 localStorage.foo="FOO value"
引用它)。请记住这里有大小限制,所以不要太疯狂。此外,清除 Mobile Safari 的缓存根本不会影响您的应用程序(沙盒),并且它还会在更新过程中持续存在(但不是删除 + 重新安装)。
jcesarmobile - 谢谢,我有空的时候会看看 jira 和博客。关于文档,这有很多关于 localstorage 的详细信息 - cordova.apache.org/docs/en/3.0.0/…,但对于当前版本,cordova.apache.org/docs/en/3.5.0/… 它只是将您引向 W3C 规范。我可以使用 3.0 指南吗?
Kerri - 感谢您的回复。根据我对文档所做的上述评论,我以前没有见过你的 localStorage.foo="FOO value" 语法。只是为了让我在做网络工作时保持一致,我可以在 Android/iOS 中使用 setItem 等并且仍然可以使用修复吗?还是该修复仅适用于您的语法?【参考方案2】:
如果您仍然遇到 Cordova-iOS v4 的问题,请尝试使用 NativeStorage 插件。 https://www.npmjs.com/package/cordova-plugin-nativestorage.
它具有设置、放置和获取功能,可实现平台功能,如 android 共享首选项和 iOS NSUserDefaults,使数据存储尽可能安全。
cordova plugin add cordova-plugin-nativestorage
NativeStorage.putObject("reference_to_value",<object>, <success-callback>, <error-callback>);
NativeStorage.getObject("reference_to_value",<success-callback>, <error-callback>);
【讨论】:
【参考方案3】:最好的办法是使用 NativeStorage 插件:
https://www.npmjs.com/package/cordova-plugin-nativestorage
回答您的问题:
localStorage
数据保存在文件系统的缓存目录中,并且缓存被操作系统频繁清理(例如当设备磁盘空间不足时)。
不,更新应用不会清除本地存储。
不,Safari 本地存储和 Webview 本地存储是分开的。
不,您无法控制它在文件系统上的存储位置。
【讨论】:
以上是关于iOS 7 webview 和 localStorage 持久化的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 7 WebView 上的 HTML 输入控件中选择文本时如何删除或禁用“定义”选项?
ios Flutter应用程序的webview中的键盘不显示