我有一个使用 localStorage
的 ionic 项目,已经工作了几个月,但是在我添加人行横道之后 localStorage
不再工作了。奇怪的是,我使用 ionic start todo-list sidemenu 创建了另一个应用程序
并使用 localStorage
创建了一个简单的 todo-list 并且工作了。
可能问题出在我的另一个应用程序中,结合了人行横道,这会冲突并破坏 localStorage
。
我知道我说的含糊不清,但也许有人会遇到同样的问题。
在 this link :
Crosswalk WebView stores data (IndexedDB, LocalStorage, etc) separately from System WebView
我是这样使用的:
window.localStorage.setItem('foo', 'bar');
window.localStorage.getItem('foo');
上面的示例,getItem
将显示 bar
值,但是如果我关闭应用程序并执行 getItem('foo')
在应用程序的另一部分,该值返回 null
。
此问题仅在 Android 设备(已测试 4.1、4.3 和 4.4)上发生,网络浏览器正常运行。
为了记录,这是项目中安装的插件:
com.ionic.keyboard 1.0.4 "Keyboard"
com.phonegap.plugins.PushPlugin 2.4.0 "PushPlugin"
cordova-plugin-console 1.0.0 "Console"
cordova-plugin-crosswalk-webview 1.2.0 "Crosswalk WebView Engine"
cordova-plugin-dialogs 1.1.0 "Notification"
cordova-plugin-geolocation 1.0.0 "Geolocation"
cordova-plugin-inappbrowser 1.0.0 "InAppBrowser"
cordova-plugin-network-information 1.0.0 "Network Information"
cordova-plugin-splashscreen 2.0.0 "Splashscreen"
cordova-plugin-statusbar 1.0.0 "StatusBar"
cordova-plugin-vibration 1.1.0 "Vibration"
cordova-plugin-whitelist 1.0.0 "Whitelist"
nl.x-services.plugins.toast 2.0.5 "Toast"
最佳答案
我遇到了同样的问题(使用 cordova-android 4.0 和 Crosswalk 13.42.319.11)。在添加 Crosswalk 之前,localStorage 按预期工作。添加 Crosswalk 后,如果应用程序卸载并重新启动,任何添加到本地存储的新项目都不会持久化。
通过排除过程,我在我们的应用程序中发现了以下代码似乎触发了问题:
// The purpose of this code is to check whether Safari browser is in "Private" browsing mode,
// in which case the localStorage API is available but throws an exception when setItem() is called:
// "QuotaExceededError: DOM Exception 22: An attempt was made to add something to storage that exceeded the quota."
function testLocalStorageIsSupported() {
try {
if (window.localStorage && window.localStorage.setItem && window.localStorage.getItem && window.localStorage.removeItem) {
// Store an arbitrary value
var storedValue = (new Date().valueOf()).toString();
window.localStorage.setItem("__LocalStorageIsSupported__", storedValue);
var loadedValue = window.localStorage.getItem("__LocalStorageIsSupported__");
window.localStorage.removeItem("__LocalStorageIsSupported__");
// If loaded value matches the stored value then consider localStorage to be supported.
return (storedValue == loadedValue);
}
return false;
} catch (e) {
console.log("LocalStorage: Caught an error testing availability of localstorage: " + e);
return false;
}
}
此代码在收到设备就绪事件后被调用。从应用程序中删除这段代码为我解决了这个问题。
我将问题代码缩减为一行:
window.localStorage.setItem("__LocalStorageIsSupported__", (new Date().valueOf()).toString())
我做了一些进一步的测试,创建了一个空白的 cordova-android 4.0 应用程序,并添加了 Crosswalk。最初 localStorage 正常工作。将上述单行代码添加到 deviceready 事件的回调中后,localStorage 停止持久化。
关于cordova - Ionic 项目 localStorage 在添加人行横道后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30360208/