Насколько постоянным является локальное хранилище на Android и iOS?

Когда мое приложение хранит данные локально на телефоне, насколько постоянным будет это хранилище? Я уточню точную ситуацию:

Я создаю приложение с jQueryMobile и Phonegap. По сути, это приложение для браузера, но использование Phonegap позволяет мне упаковать его и продавать в магазинах приложений, помимо других преимуществ.

Phonegap предлагает два способа хранения, оба из которых функции гармонизируют собственные функции iOs, Android, Blackberry и некоторых других ОС: localStorage (который представляет собой примитивные пары ключ-значение) и база данных Web SQL. И localStorage, и веб-SQL - это формы хранения, принадлежащие браузеру. Сказав это, я не могу понять, как долго данные будут храниться, при каких обстоятельствах они будут удалены, при каких обстоятельствах они могут быть недоступны и т. Д.

Например, если приложение хранит данные с помощью localStorage или веб-SQL, а пользователь переключается на другой стандартный браузер на своем Android, будет ли приложение открываться в новом браузере и означает ли это, что сохраненные данные недоступны?

Если пользователь не использует приложение в течение года (что в моем случае является реалистичным и не обязательно плохим сценарием), срок действия данных истек, как файла cookie, или, возможно, они были вытеснены из хранилища браузера из-за наводнения данные из других приложений?

Или данные будут уничтожены еще раньше, например, когда: - пользователь посещает другой сайт в браузере - браузер закрывается вручную - процесс браузера завершается или умирает - и т. Д.

Или localStorage и веб-SQL - это хранилище, которое вы удаляете только тогда, когда (в Android) вы переходите в Настройки> Приложения и активно удаляете пользовательские данные, связанные с приложением?

Спасибо за любые идеи. В старом WWW нет ничего информативного.

Что происходит в случае обновления приложения. Локальное и веб-хранилище будут удалены или останутся?


person Wytze    schedule 13.10.2011    source источник


Ответы (8)


Позвольте мне ответить шаг за шагом

если приложение хранит данные с помощью localStorage или веб-SQL, и пользователь переключается на другой стандартный браузер на своем Android, будет ли приложение открываться в новом браузере и означает ли это, что сохраненные данные недоступны?

Данные сохраняются в «кеше» (это не совсем кеш) браузера, поэтому, если вы измените браузер или установите настройки так, чтобы браузер по умолчанию был удален или изменен, данные уйдут.

Если пользователь не использует приложение в течение года (что в моем случае является реалистичным и необязательно плохим сценарием), срок действия данных истек, как файла cookie, или, возможно, они были вытеснены из хранилища браузера из-за наводнения данные из других приложений?

Нет, данные останутся там независимо от того, как долго они не будут использоваться. Так что даже если вы очистите кеш браузера, он все равно будет там.

Или данные будут уничтожены еще раньше, например, когда: - пользователь посещает другой сайт в браузере - браузер закрывается вручную - процесс браузера прекращается или умирает - и т. Д.

Нет, с данными все в порядке. :-)

Или localStorage и веб-SQL - это хранилище, которое вы удаляете только тогда, когда (в Android) вы переходите в Настройки> Приложения и активно удаляете пользовательские данные, связанные с приложением?

Да, данные поступают только в том случае, если вы либо вручную удалите их из своего приложения, либо удалите свое приложение. Он останется во всех остальных случаях.

РЕДАКТИРОВАТЬ: в случае iOS ОС удалит данные из локального хранилища при нехватке памяти на устройстве.

person ghostCoder    schedule 13.10.2011
comment
Подождите, вы не можете изменить chromeview / webview на что-то еще в вашем приложении Cordova, или можете? - person Daniel Cheung; 09.01.2015
comment
Этот вопрос скорее теоретический, чем практический, поэтому у меня нет кода для него. Я использую приложение PWA на мобильных устройствах и храню данные в локальном хранилище. Все идет нормально. Но если я принудительно очистил (отключил приложение от работы в фоновом режиме), я считаю, что локальное хранилище очищается, что не идеально. Есть ли способ запретить ОС или браузеру автоматически очищать локальное хранилище? - person akshay kishore; 22.10.2019

Начиная с iOS 5.1 ответ @ ghostCoder больше не действителен. Apple решила переместить локальное хранилище в папку кеша, которую можно очистить в любой момент. Вы можете отслеживать это обсуждение здесь:

http://www.marco.org/2011/10/13/ios5-caches-cleaning < / а>

Можно вручную указать для локального хранилища безопасное расположение Application_Home> / Documents. Чтобы определить ваше текущее местное хранилище, вы можете использовать что-то вроде этого:

NSString* localStorageSubdir = (IsAtLeastiOSVersion(@"5.1")) ? @"Caches" : @"WebKit/LocalStorage";
NSString* localStoragePath = [library stringByAppendingPathComponent:localStorageSubdir];
NSString* localStorageDb = [localStoragePath stringByAppendingPathComponent:@"file__0.localstorage"];

Следующий код позволяет вам установить другое местоположение для вашего локального хранилища:

NSString* bundleIdentifier = [[mainBundle infoDictionary] objectForKey:@"CFBundleIdentifier"];
NSString* libraryPreferences = @"Library/Preferences";
NSString* appPlistPath = [[bundlePath stringByAppendingPathComponent:libraryPreferences]    stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", bundleIdentifier]];

NSString *value;
NSString *key = @"WebKitLocalStorageDatabasePathPreferenceKey";
value = [appPlistDict objectForKey: key];
if (![value isEqual:ourLocalStoragePath]) {
    [appPlistDict setValue:yourPreferredLocalStoragePath forKey:key];
} 
person dvtoever    schedule 22.03.2012
comment
Ой! Спасибо за предупреждение, собирался опубликовать на iOS. - person Wytze; 22.03.2012
comment
привет, ты знаешь, как я могу сделать то же самое на Android? получить местный путь хранения? - person andrei; 01.11.2017
comment
Этот код все еще работает с ios11 и данные будут в безопасности? - person Mohammad Shraim; 30.11.2017

Попробуйте плагин NativeStorage. https://www.npmjs.com/package/cordova-plugin-nativestorage .

Он установил, поместил и получил функции, которые реализуют возможности платформы, такие как общие настройки Android и iOS NSUserDefaults, что делает хранилище данных максимально безопасным.

cordova plugin add cordova-plugin-nativestorage

NativeStorage.putObject("reference_to_value",<object>, <success-callback>, <error-callback>);

NativeStorage.getObject("reference_to_value",<success-callback>, <error-callback>);
person Community    schedule 20.04.2016

Хорошее решение, доступное сейчас, - это подключаемый модуль Cordova Native Storage.

Он позволяет использовать простой, но нативный постоянный метод сохранения данных в iOS и Android за счет встроенной реализации SharedPreferences в Android и NSDefault в iOS, чтобы гарантировать надежность.

Использование:

Установка:

cordova plugin add cordova-plugin-nativestorage

Сохранение значений:

NativeStorage.setItem("reference_to_value",<value>,<success-callback>, <error-callback>);

Получение значений:

NativeStorage.getItem("reference_to_value",<success-callback>, <error-callback>);
person Iceman    schedule 23.08.2016

На android по умолчанию это постоянное хранилище. Даже если пользователь обновит ваше приложение, оно останется прежним.

Пользователь может перейти к настройкам и очистить кеш и данные, и в этом случае это произойдет, или, скажем, одно из приложений clean-it это сделает.

Даже на iOS это постоянное хранилище, но мы не знаем о сценарии обновления приложения. Но в более старой версии (5.1) этого не было, и в 6+ они сделали, что это может быть сделано постоянным с помощью флага, который был быстро включен с помощью cordova / phonegap.

person aWebDeveloper    schedule 21.03.2016
comment
Могу ли я поставить свою жизнь на то, чтобы быть правдой (и оставаться правдой) для Android? Под жизнью я подразумеваю важные данные. - person Michael; 11.05.2016
comment
@Michael, я бы не стал использовать локальное хранилище для критических данных. Поищите в Интернете и блогах, многое может пойти не так. - person Sarantis Tofas; 12.06.2017
comment
у вас есть идея, как я могу получить доступ к локальному хранилищу на Android из Java-кода? - person andrei; 01.11.2017
comment
нет, не разработчик Java, но если вы делаете приложение Cordova, попробуйте передать его из Cordova - person aWebDeveloper; 07.11.2017

Я не могу говорить о других платформах, но на моем устройстве Android 4.1 я использую localStorage для локального хранения некоторых данных с помощью jQuery Mobile, и я обнаружил, что Android очищает мой кеш каждую неделю или около того без моего ведома. Я собираюсь попробовать Web SQL и посмотреть, лучше ли это.

person qJake    schedule 13.12.2012
comment
Спасибо за обновление SpikeX! Я предполагаю, что Phonegap / Cordova предложит исправление почти так же быстро, как и для iOS (я думаю, это было около месяца). Но это вариант не для всех. - person Wytze; 09.01.2013
comment
@Wytze, можете ли вы предоставить источник, который утверждает, что PhoneGap устранил проблему на iOS? - person Dheeraj Vepakomma; 02.05.2014
comment
@Dheeraj Нет, извините, это больше года назад. Я помню, что проблема была исправлена ​​в одной из следующих версий Phonegap. С тех пор никогда не было проблем ни на Android, ни на iOS. - person Wytze; 05.05.2014

Было бы лучше с точки зрения производительности, безопасности и надежности ИЗБЕГАТЬ использования локального хранилища и использовать _ 1_.

Некоторые примечания:

localStorage имеет то преимущество, что его легко использовать, но он работает синхронно. Это означает, что он может заблокировать поток пользовательского интерфейса и снизить производительность.

localStorage имеет ограниченный объем памяти, обычно 5 МБ.

localStorage может быть удалено ОС (android, ios) в любое время. Это действительно серьезно, если вы заботитесь о сохранении данных.

С другой стороны:

Cordova-sqlite-storage является асинхронным и не блокирует поток пользовательского интерфейса, он сохраняет ваши данные в собственном хранилище устройства, объем хранилища не ограничен, ОС не удалит какие-либо ваши данные, если вы не удалите приложение.

person Sarantis Tofas    schedule 27.05.2017
comment
Удаление локального хранилища по-прежнему является проблемой для iOS11? - person user1261710; 25.01.2018

Я нашел это в Интернете ng-persist

Храните данные на мобильных устройствах (используя Cordova), которые сохраняются, даже если пользователь переустанавливает приложение.

Установить

bower install ng-persist ngstorage --save

Вставьте $persist в ваш контроллер

.controller('MyCtrl', function($persist) {

    $persist
        .set(namespace, key, val)
        .then(function () {
            // saved
        });

    // read
    $persist
        .get(namespace, key, fallback)
        .then(function (val) {
            // val is either the value, if exists, or the fallback
        });

    // delete
    $persist
        .remove(namespace, key)
        .then(function () {
            // removed
        });

});
person niksmac    schedule 19.02.2016
comment
Это просто оболочка для LocalStorage! см. в примечаниях, что он говорит, что работает в браузере с локальным хранилищем - person Nico Westerdale; 12.10.2017