Наскільки постійним є локальне сховище на Android та iOS?


75

Коли мій додаток зберігає дані локально на телефоні, наскільки постійним є це сховище? Я детально розберу ситуацію:

Я будую додаток за допомогою jQueryMobile та Phonegap. По суті, це браузерний додаток, але використання Phonegap дозволяє, серед інших переваг, упаковувати його та продавати в магазинах програм.

Phonegap пропонує два способи зберігання, обидва з яких гармонізують власні функції iO, Android, Blackberry та деяких інших ОС: localStorage (це примітивні пари ключ-значення) та база даних Web SQL. І localStorage, і веб-SQL є формами сховища, що належать браузеру. Сказавши це, я не можу дізнатися, як довго дані будуть зберігатися, за яких обставин вони будуть видалені, за яких обставин вони можуть бути недоступними тощо.

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

Якщо користувач не користується програмою протягом року (що в моєму випадку є реалістичним і не обов'язково поганим сценарієм), чи закінчився термін дії даних, як файл cookie, або, можливо, був витіснений із пам'яті браузера потоком дані з інших програм?

Або дані будуть знищені ще раніше, наприклад, коли: - користувач відвідує інший сайт у браузері - браузер закривається вручну - процес браузера вбивається або вмирає - і т.д.

Або localStorage та веб-SQL - це той тип сховища, який ви видаляєте лише тоді, коли (в Android) ви переходите в Налаштування> Програми та активно видаляєте дані користувача, пов’язані з програмою?

Дякуємо за будь-яку інформацію. На старому WWW нічого інформативного немає.

Що відбувається у випадку оновлення програми. Місцеве та веб-сховище буде видалено або воно залишиться?

Відповіді:


58

Дозвольте відповісти крок за кроком

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

Дані зберігаються у "кеш-пам’яті" (це не зовсім кеш-пам'ять) браузера, тому, якщо ви зміните браузер або налаштуєте параметри так, щоб браузер за замовчуванням був видалений або змінений, дані підуть.

Якщо користувач не користується програмою протягом року (що в моєму випадку є реалістичним і не обов'язково поганим сценарієм), чи закінчився термін дії даних, як файл cookie, або, можливо, був витіснений із пам'яті браузера потоком дані з інших програм?

Ні, дані залишатимуться там незалежно від того, як довго вони не використовуються. Отже, навіть якщо очистити кеш браузера, він все одно буде там.

Або дані будуть знищені ще раніше, наприклад, коли: - користувач відвідує інший сайт у браузері - браузер закривається вручну - процес браузера вбивається або вмирає - і т.д.

Ні, дані залишаються в порядку. :-)

Або localStorage та веб-SQL - це той тип сховища, який ви видаляєте лише тоді, коли (в Android) ви переходите в Налаштування> Програми та активно видаляєте дані користувача, пов’язані з програмою?

Так, дані надходять лише у випадку, якщо ви вручну видалили їх із програми або видалили програму. Це залишиться в усіх інших випадках.

РЕДАГУВАТИ: у випадку iOS ОС видалить дані з локальної пам’яті, коли в пристрої бракує пам’яті.


Зачекайте, ви не можете змінити chromeview / webview на щось інше у вашому додатку cordova, чи не так?
Даніель Чонг

Це питання скоріше теоретичне, аніж практичне, отже, у мене немає коду, щоб показати його. Я використовую програму PWA у мобільних телефонах і зберігаю дані в локальному сховищі. все йде нормально. Але якщо я змушую очистити (видалити програму з фонового запуску), я вважаю, що локальне сховище очищається, що не є ідеальним. Чи є спосіб запобігти операційній системі або браузеру автоматично очищати локальне сховище?
akshay kishore

39

Станом на iOS 5.1 відповідь @ ghostCoder більше не дійсна. Apple вирішила перемістити локальне сховище в папку кеш-пам’яті, яку можна очистити будь-коли. Ви можете простежити цю дискусію тут:

Обговорення груп Google щодо місцевого зберігання

Також цей блог детальніше пояснює проблему:

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];
} 

2
Так! Дякую за попередження, я збирався опублікувати в iOS.
Wytze

Я знаю, що це шлях у майбутнє. Але, погляньте на мою відповідь нижче, використовуючи власний плагін реалізації: stackoverflow.com/a/39097517/6237235
Iceman

привіт, ти знаєш, як я можу робити те саме на Android? отримати місцевий шлях до зберігання?
andrei

1
цей код все ще працює з ios11 і дані будуть у безпеці?
Мохаммед Шрайм,

6

Спробуйте плагін 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>);

4

Хорошим рішенням, яке зараз доступне, є плагін власного зберігання Cordova .

Це дозволяє простий, але вбудований стійкий метод збереження даних в 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

На android це постійне сховище за замовчуванням. Навіть якщо користувач оновлює вашу програму, вона залишається незмінною.

Користувач може перейти до налаштувань і очистити кеш-пам’ять і дані, і в цьому випадку це відбувається, або якщо скаже, що це робить один із чистих додатків.

Навіть на iOS це постійне сховище, але я не знаю про сценарій оновлення програми. Але у старішій версії (5.1) цього не було, і в 6+ вони зробили, що це можна зробити постійним через прапор, який був негайно увімкнений cordova / phonegap.


Для Android це щось, на що я можу поставити своє життя на те, щоб бути правдою (і залишатися правдою)? І під "життям" я маю на увазі "критичні дані".
Майкл

3
@Michael, я б не використовував локальне сховище для критичних даних. Шукайте в Інтернеті та в блогах, багато чого може піти не так.
Сарантіс Тофас

у вас є ідея, як я можу отримати доступ до локального сховища на Android з коду Java?
andrei

nope не розробник Java, але якщо ви робите додаток cordova, спробуйте передати його з cordova
aWebDeveloper

1

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


Дякуємо за оновлення SpikeX! Я припускаю, що Phonegap / Cordova придумають виправлення майже так само швидко, як і для iOS (це, я думаю, було близько місяця). Але це не для всіх.
Wytze

@Wytze можете надати джерело, яке стверджує, що PhoneGap виправило проблему на iOS?
Dheeraj Vepakomma

@Dheeraj Ні, вибачте, це більше року тому. Я пам’ятаю, що проблему було виправлено в одній із наступних версій Фонегапа. З тих пір ніколи не було проблем з цим, ні на Android, ні на iOS.
Wytze,

1

З точки зору продуктивності, безпеки та надійності ВІДБУДАТИСЯ, використовуючи місцеве сховище та використовувати Cordova-sqlite-storageзамість цього.

Деякі примітки:

localStorageмає перевагу в тому, що він простий у використанні, але працює синхронно. Це означає, що він може заблокувати потік інтерфейсу та спричинити повільну роботу.

localStorage має обмежений обсяг пам’яті, як правило, 5 Мб.

localStorageможе бути знищена ОС (android, ios) у будь-який час. Це дійсно серйозно, якщо ви дбаєте про збереження даних.

З іншої сторони:

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


Чи знищено локальне сховище, як і раніше проблема в iOS11?
user1261710

0

Я знайшов це в Інтернеті 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
        });

});

Це просто обгортка для LocalStorage! див. у примітках, в яких сказано: "працює у браузері з локальним сховищем"
Ніко Вестердейл,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.