Localstorage в ionicframework, привет от cordova

Все мы храним информацию между запусками приложения. Где это делать для html странички на мобильном устройстве? Самый быстрый способ это использовать window.localstorage, но оказалось не самый правильный.

Побудило в этом разобраться сообщения от ios пользователей, что на их устройствах очищаются данные в приложении.

Про localstorage

Представляет из себя объект, реализующий интерфейс Storage для доступа к сессионному хранилищу или локальному для добавления, удаления, изменения данных. В нашем случае это локальное хранилище. По сути key/value map с методами доступа к данным.

C developer.mozzila.org сообщают

Свойство localStorage позволяет получить доступ к локальному Storage объекту.localStorage аналогичено свойству sessionStorage. Разница только в том, свойство sessionStorage хранит данные в течение сеанса (до закрытия браузера), в отличие от данных,  находящихся в свойстве localStorage, которые не имеют ограничений по времени хранения и могут быть удалены только с помощью JavaScript

Объем хранимой информации 2 мб —  5 мб — 10 мб. Нигде толком не написано, но можно провести тест самому. Всплывают различные статьи, основанные на данном исследовании.

Что-то пошло не так

У ionic есть статья посвященная localstorage и работе с ним — http://learn.ionicframework.com/formulas/localstorage/. В ней упоминается про загрузку данных приложения в  iCloud, пример создания сервиса в angularJS и в конце рекомендуют его использовать в качестве простого хранилища.

Но есть на форуме ionic темка в которой вопрошают, почему в статье, что я упомянул выше не указывается время хранения объектов и приводится ссылка на stackoverflow, где разбирают изменения в коде phonegap aka cordova. А изменения интересные — ссылка на код. Кому глаза колит читать objective-c, скажу, что там чекают версию ios и если она выше 5.1, то хранилищем для localstorage делают «~/Library/Caches». Это означает, что оно может очищаться, если ios нехватает места.

С данным поведением мы и столкнулись. Пришлось перенести хранилище из localstorage в более укромное место, куда не дотянутся жадные руки ios.

Cordova-plugin-file спешит на помощь

Каждый разработчик желает знать, где живет файл. Эти таблички нужны каждому разработчику, который собирается хранить файлы с данными на мобильном устройстве. Обратите внимание на папку Cloud и  NoCloud. Если раньше за backup  в  iCloud отвечало системное свойство cordova

<preference name="BackupWebStorage" value="none" />

То теперь самостоятельно заботимся о расположении.

iOS File System Layout

Device Path cordova.file.* iosExtraFileSystems r/w? persistent? OS clears sync private
/var/mobile/Applications/<UUID>/ applicationStorageDirectory r N/A N/A N/A Yes
   appname.app/ applicationDirectory bundle r N/A N/A N/A Yes
      www/ r N/A N/A N/A Yes
   Documents/ documentsDirectory documents r/w Yes No Yes Yes
      NoCloud/ documents-nosync r/w Yes No No Yes
   Library library r/w Yes No Yes? Yes
      NoCloud/ dataDirectory library-nosync r/w Yes No No Yes
      Cloud/ syncedDataDirectory r/w Yes No Yes Yes
      Caches/ cacheDirectory cache r/w Yes* Yes*** No Yes
   tmp/ tempDirectory r/w No** Yes*** No Yes

Android File System Layout

Device Path cordova.file.* AndroidExtraFileSystems r/w? persistent? OS clears private
file:///android_asset/ applicationDirectory r N/A N/A Yes
/data/data/<app-id>/ applicationStorageDirectory r/w N/A N/A Yes
   cache cacheDirectory cache r/w Yes Yes* Yes
   files dataDirectory files r/w Yes No Yes
      Documents documents r/w Yes No Yes
<sdcard>/ externalRootDirectory sdcard r/w Yes No No
   Android/data/<app-id>/ externalApplicationStorageDirectory r/w Yes No No
      cache externalCacheDirectry cache-external r/w Yes No** No
      files externalDataDirectory files-external r/w Yes No No

В работе с плагином ничего интересно, типичный promise. Единственное надо помнить про асинхронность дабы не было INVALID_MODIFICATION_ERR. Удачного переноса данных.

Добавить комментарий