Ionic项目添加Crosswalk后,localStorage停止工作

3
我有一个使用localStorage的ionic项目,在添加Crosswalk之后,localStorage不再工作。奇怪的是,我创建了另一个应用程序,并使用ionic start todo-list sidemenu创建了一个简单的待办事项列表,使用localStorage也能正常工作。
可能是我的另一个应用程序与Crosswalk相结合的某些内容发生冲突,破坏了localStorage
我知道我说得太笼统了,但或许有人遇到过同样的问题。
this link中:
    

Crosswalk WebView会将数据(IndexedDB、LocalStorage等)分别存储于系统WebView之外。

我的代码如下:
window.localStorage.setItem('foo', 'bar');
window.localStorage.getItem('foo');

在上面的例子中,getItem将显示bar值,但如果我关闭应用程序并在应用程序的另一部分执行getItem('foo'),则返回值为null
问题只发生在Android设备上(已测试4.1、4.3和4.4),在Web浏览器上可以工作。
记录一下,这是项目中安装的插件:
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"

当你说localStorage不再起作用时,你是指你的旧数据消失了吗?如果你在System Webview localStorage中保存了旧数据,那么当你使用Crosswalk WebView时,这些数据消失是很正常的,就像你发布的链接所述。 - Augusto Destrero
本地存储是浏览器的一个功能,与任何 Cordova 插件无关。但是,你使用的键可能与其他插件相同。 - Manish Kr. Shukla
@baxeico 不是旧数据,添加 crosswalk 后,如果我执行 setItem('foo', 'bar') 然后关闭应用程序并尝试 getItem('foo') ,它将返回 null。 如果我在执行 setItem('foo', 'bar') 并且在下面执行 getItem('foo'),我将得到 bar 值。 我在问题中进行了一点更新。 - Daniel Faria
奇怪。我建议按照此教程进行远程调试您的应用程序。在“资源”下的开发工具中,您可以找到localStorage数据。祝你好运! - Augusto Destrero
1个回答

1

我遇到了同样的问题(使用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;
    }
}

这段代码在接收到“deviceready”事件后被调用。将此代码从应用程序中移除,问题得到了解决。
我将问题代码缩减为一行:
window.localStorage.setItem("__LocalStorageIsSupported__", (new Date().valueOf()).toString())

我进行了进一步的测试,创建了一个空的cordova-android 4.0应用程序,并添加了Crosswalk。最初localStorage按照预期工作。在将上述单行代码添加到deviceready事件的回调中后,localStorage停止持久化。

你说的正是我遇到的问题,但我不明白你代码中是什么触发了这个问题,是 date 吗? - Daniel Faria
好的,我已经拿到代码了,你认为存储的日期格式是问题所在吗?你是如何解决它的? - Daniel Faria
这只是在应用程序启动后不久调用localStorage.setItem()的事实(因此与实际存储的数据无关-无论是日期还是其他任何内容)。我怀疑这是一个时间敏感问题-即在某个特定的时间长度之前,似乎调用localStorage.setItem()是不安全的,但是在经过一段时间后,它似乎是可以的。我通过删除应用程序启动代码中的localStorage.setItem()调用来解决了这个问题。我建议您逐步查找代码,找到在应用程序启动后不久或很快调用localStorage.setItem()的任何实例。 - SimonNZ
可能是因为localStorage还没有准备好,所以返回了null。是否有类似于“webview.ready”这样的事件?也许它可以解决这个问题。 - Daniel Faria
我在这里进行了测试,但是不起作用。我在应用程序启动时立即访问localStorage,我没有使用任何setItem,而是使用getItem,我认为我尝试得太早了,它是null,但是我在getItem之前放置了3秒的超时,问题仍然存在。 - Daniel Faria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接