2015-05-20 5 views
3

У меня есть ионный проект, который использует localStorage, работает в течение нескольких месяцев, но после того, как я добавил пешеходный переход, localStorage больше не работает. Странная вещь, я создаю другое приложение с ionic start todo-list sidemenu и создал простой список дел, используя localStorage и работал.Ионный проект localStorage перестает работать после добавления пешеходного перехода

Возможно, проблема связана с чем-то в моем другом приложении в сочетании с переходом, который противоречит и разрушает localStorage.

Я знаю, что я сказал, чтобы расплывчато, но, возможно, у кого-то была такая же проблема.

В this link:

Пешеходный WebView хранит данные (IndexedDB, LocalStorage и т.д.) отдельно от системы WebView

Я использую как это:

window.localStorage.setItem('foo', 'bar'); 
window.localStorage.getItem('foo'); 

пример выше, getItem отображает значение bar, но если я закрываю e приложение и сделайте 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" 
+0

Когда вы говорите, что localStorage больше не работает, вы имеете в виду, что ваши старые данные исчезли? Если у вас есть старые данные, сохраненные в System Webview localStorage, это нормально, что эти данные исчезают при использовании Crosswalk WebView, поскольку указанная вами ссылка указана. – baxeico

+0

localStorage - это функция браузера и не имеет ничего общего с плагином cordova. Но может случиться так, что ключ, используемый вами и другим плагином, оказывается одним и тем же. –

+0

@ baxeico не старые данные, после добавления пешеходного перехода, если я делаю 'setItem ('foo', 'bar')' закрыть приложение и попробовать 'getItem ('foo')' он возвращает 'null'. Если я делаю 'setItem ('foo', 'bar')' и ниже 'getItem ('foo')' У меня есть значение 'bar'. Я сделал небольшое обновление в вопросе –

ответ

1

У меня была такая же проблема (с помощью Cordova-андроид 4.0 и пешеходном 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()) 

Я сделал некоторые дальнейшие испытания, путем создания пустого 4.0 приложения Cordova-андроидом, и добавления Пешеходного. Первоначально localStorage работает так, как должно. После добавления вышеуказанной отдельной строки кода в обратный вызов для события deviceready, localStorage перестала существовать.

+0

То, что вы сказали, именно то, что происходит со мной, но я не могу понять, что в вашем идентификаторе кода, вызывающем проблему, является «датой»? –

+0

Хорошо, я получил код, как вы думаете, сохранен ли формат даты? Что вы сделали, чтобы решить эту проблему? –

+0

Это просто факт вызова 'localStorage.setItem()' вскоре после запуска приложения (так что ничего общего с тем, какие данные фактически хранятся, будь то дата или что-то еще). Я подозреваю, что это проблема с синхронизацией времени, то есть определенный промежуток времени, перед которым, как представляется, небезопасно вызывать 'localStorage.setItem()', но по прошествии этого времени кажется, что все в порядке. Я разрешил его, удалив вызов 'localStorage.setItem()' в стартовом коде приложения. Я предлагаю вам выполнить свой код, чтобы найти какие-либо экземпляры, где 'localStorage.setItem()' вызывается вскоре или очень скоро после запуска вашего приложения – SimonNZ

Смежные вопросы