Как избежать стирания данных локального веб-приложения? - PullRequest
5 голосов
/ 08 мая 2020

Мы хотели бы, чтобы наше веб-приложение было доступно в автономном режиме, в основном на мобильных устройствах. Мы написали для этого код с помощью сервис-воркера. Данные приложения хранятся в IndexedDb, а код приложения (html, js, css, и c) хранится в кэше SW. Все идет нормально. Мы знаем, что пользователь может удалить кеш браузера и наши данные, это не проблема. Но как насчет того, чтобы сам браузер стирал данные приложения? Мы не нашли исчерпывающей спецификации для этого, основная информация, которую мы нашли:

1) StorageManager функция, которая в настоящее время помечена как «экспериментальная» (с 2016 г.);

2) короткая статья из Google здесь об этом (также с 2016 года).

Пример кода следующий:

if (navigator.storage && navigator.storage.persist)
  navigator.storage.persist().then(granted => {
    if (granted)
      alert("Storage will not be cleared except by explicit user action");
    else
      alert("Storage may be cleared by the UA under storage pressure.");
  });

The Google В статье говорится:

Когда объем хранилища на локальном компьютере ограничен («нехватка хранилища»), пользовательские агенты автоматически очищают хранилище, чтобы освободить больше свободного места. Конечно, для автономных приложений это может быть неудачно, поскольку они, возможно, еще не синхронизировали свои данные с сервером, или это могут быть приложения, которые пользователь ожидает просто работать в автономном режиме (например, музыкальный проигрыватель); таким образом, Storage spe c определяет два разных режима хранения для данного домена - «лучший из возможных» и «постоянный». Режим по умолчанию, конечно же, «лучший из возможных». Хранилище для домена, который является «максимальным» (также известным как «непостоянный»), может быть очищено автоматически, без прерывания или запроса пользователя. Однако «постоянные» данные не удаляются автоматически. (Если после очистки всех непостоянных данных система все еще находится под давлением, пользователю необходимо вручную очистить все оставшееся постоянное хранилище.)

...

Начиная с Chrome 55, Chrome автоматически предоставит разрешение на сохранение, если выполняется одно из следующих условий:

  • Сайт добавлен в закладки (и у пользователя 5 или меньше закладок)
  • Сайт имеет высокий уровень взаимодействия с сайтом
  • Сайт добавлен на главный экран
  • На сайте установлено pu sh уведомления включены

Разрешение автоматически отклоняется во всех остальных случаи.

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

Это для Chrome 55, предположим, что информация до настоящего времени. На первый взгляд их цель кажется разумной, но если вы присмотритесь, то реализация ориентирована на «большие» сайты (а-ля Google), а не на нишевые приложения, которые более ориентированы на задачи.

Действительно, при тестировании на различных телефонах Android на Chrome 80+ постоянство всегда отклоняется без взаимодействия с пользователем. Итак, это "максимум усилий".

Мы могли бы остановить расследование здесь и положить конец этому. В конце концов, нынешние телефоны и P C имеют нечестивый объем памяти, а мы используем всего несколько сотен КБ, так что с нами все будет в порядке. Проблема в том, что это не так: тестирование на новом флагманском телефоне Android с Chrome, наш код стирается всего за несколько секунд возни (достаточно закрыть и открыть страницу несколько раз). На других платформах все по-другому, но Android + Chrome будет наиболее востребованным.

Как ни странно, стирается только код в кэше SW (<100 КБ), а более крупный IndexedDb - нет. Итак, мы попытались также поместить код в IndexedDb, и в этом случае он кажется более «постоянным», но код для управления им также более сложен, поэтому он кажется несколько хакерским sh. </p>

Мы наедине с этой проблемой? Если нет, то как вы, люди, справляетесь с этим?

Дополнительный вопрос: есть ли где-нибудь более свежая документация по этому вопросу?

1 Ответ

1 голос
/ 19 мая 2020

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

До сих пор я еще не был в этой ситуации, но я наблюдал за поведением, вы цитируете из https://developers.google.com/web/updates/2016/06/persistent-storage - я только что сделал до сих пор не знал, что это явно задокументировано.

Я вижу три способа, как некоторые веб-сайты обеспечивают постоянное хранение пользовательских данных:

  1. Неоднократно просите пользователя добавить веб-сайт на главный экран и / или для включения уведомлений pu sh. Я заметил, что этот запрос часто почему-то поступает под ложным флагом, т.е. что-то вроде «Подпишитесь на уведомления, чтобы выразить свою признательность» вместо «Разрешено ли нам хранить данные постоянно?» . Это может даже go настолько, что «Установить наше приложение» по существу означает, что полноэкранный экземпляр Chrome добавляется на главный экран мобильного устройства, а не реальное приложение из app store.

  2. Некоторые сайты предлагают Chrome расширение , которое позволяет им хранить там данные и даже получать больше прав доступа. Я лично не предлагаю такой подход, он каким-то образом создает странное ощущение у пользователей, осведомленных о безопасности. по сути это просто настроенный браузер . Подарите мне секунду, если это звучит странно на первый взгляд. Эта опция на самом деле довольно легко доступна, например, в React Native как компонент react-native-webbrowser . Очевидно, что это требует усилий по программированию, но довольно много новостных сайтов, похоже, используют этот подход.

Варианты 1 и 2 придерживаются Chrome, но явно не относятся к вам, поскольку вы просто хотите, чтобы не беспокоить пользователя.

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

...