Насколько постоянны локальные хранилища на Android и iOS? - PullRequest
74 голосов
/ 13 октября 2011

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

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

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

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

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

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

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

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

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

Ответы [ 8 ]

57 голосов
/ 13 октября 2011

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

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

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

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

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

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

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

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

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

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

38 голосов
/ 22 марта 2012

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

Обсуждение групп Google на Localstorage

Также этот блог объясняет проблему более подробно:

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];
} 
6 голосов
/ 20 апреля 2016

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

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

4 голосов
/ 23 августа 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>);
4 голосов
/ 21 марта 2016

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

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

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

1 голос
/ 27 мая 2017

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

Некоторые заметки:

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

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

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

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

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

1 голос
/ 13 декабря 2012

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

0 голосов
/ 19 февраля 2016

Я нашел это онлайн 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
        });

});
...