Ионный проект localStorage перестает работать после добавления пешеходного перехода
У меня есть ионный проект, который использует localStorage
, работает в течение нескольких месяцев, но после того, как я добавил пешеходный переход localStorage
больше не работает Странно то, что я создаю еще одно приложение с ionic start todo-list sidemenu
и создал простой список задач, используя localStorage
и работал.
Вероятно, проблема в том, что в моем другом приложении в сочетании с пешеходным переходом что-то противоречит и разрушает localStorage
,
Я знаю, что я сказал, чтобы расплывчато, но, возможно, кто-то мог иметь эту же проблему.
По этой ссылке:
Crosswalk WebView хранит данные (IndexedDB, LocalStorage и т. Д.) Отдельно от 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"
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 локальное хранилище перестало сохраняться.