Управление загрузкой кеша приложения

Я разработал веб-приложение для iPad, которое использует кэш приложений. Это не полностью автономное приложение, но я использую кэш приложений для хранения больших файлов изображений, чтобы они не отправлялись через 3G. Проблема заключается в том, что когда манифест обновляется, кэш приложения обновляет независимо от того, подключен ли iPad к Wi-Fi или 3G, что может быть дорого.

Возможно ли, чтобы пользователь сам решал, можно ли обновлять кэш приложений? Из того, что я видел, это невозможно, все происходит автоматически, вы просто получаете события. Но, возможно, есть какая-то хитрость, например, написание манифеста на лету или что-то подобное.

Использование PHP на стороне сервера, если это поможет. Спасибо.


person Richard    schedule 02.10.2012    source источник


Ответы (3)


Тип подключения: теория и будущее

Существует черновик спецификации Network Information API на W3C, предоставляющий информацию о соединении. тип (ethernet wifi 2g 3g 4g и т. д.), но он еще не реализован ни в одном браузере, кроме:

  • стандартный браузер Android на Android 2.2+ (не браузер Google Chrome)

    navigator.connection.type // На основе проекта W3C (реализовано в стандартном браузере Android)

  • и PhoneGap, который не совсем браузер.

    navigator.network.connection.type // в PhoneGap

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

Вам также, вероятно, придется отменить обновление кеша приложения, используя: window.applicationCache.abort() (документация)

Реальность

К сожалению, Net Info API недоступен (по крайней мере, не получил широкого распространения) на данный момент, но наверняка поможет в будущем.

Дальний план

Существует база данных, включающая скорость сети (DIAL = коммутируемый доступ, DSL = широкополосный/кабельный, COMP = компания/T1), но я ею не пользовался и сомневаюсь, что она поможет.

Динамический кэш приложений

Проверяя это, я попытался сгенерировать тег html вместе с объявлением манифеста на лету, чтобы объединить его с API-интерфейсом Network Info, но манифест AppCache загружается до выполнения javascript и после этого не изменяется. Таким образом, изменение файла манифеста на лету через Javascript невозможно, а URI данных не подходит.

Альтернативное решение

Кэш приложений HTML5 в настоящее время является диким зверем, и есть переговоры чтобы улучшить его. Пока он не изменится для поддержки более сложных конфигураций (флаг уровня пропускной способности был бы отличным), вы можете изменить точку зрения на решение, хотя App Cache может быть лучшим, что у вас есть на данный момент.

В зависимости от того, насколько велики ваши изображения, вы можете полагаться на обычный кеш браузера. Вы можете комбинировать localStorage и далекое будущее заголовки HTTP с истечением срока действия. LocalStorage для отслеживания загруженных/кешированных изображений.

  • Сначала добавьте дату истечения срока действия в далеком будущем для заголовков HTTP ваших изображений.
  • При загрузке страницы удалите все src из imgs
  • Зациклите изображения и проверьте localStorage, если каждое изображение было загружено в прошлом.
  • Если есть изображения, которые не были загружены в прошлом, отобразите диалоговое окно, подтверждающее загрузку этих изображений.
  • Если изображение было загружено в прошлом, верните src на img.
  • Для каждого загруженного изображения сохраните его URL-адрес в localStorage.
person Sev    schedule 14.10.2012

Я не знаю, каков статус indexedDB на iPad, но это может быть альтернативным решением.

Вкратце: Indexeddb — это клиентская база данных. Данные хранятся в хранилищах объектов, которые представляют собой пары ключ/значение. Максимальный объем хранилища теоретически является максимальным объемом вашего дискового пространства. Для получения дополнительной информации об indexeddb:

Что вы можете сделать с indexeddb:

Когда кто-то переходит на страницу:

  • Проверьте каждый тег изображения, если он присутствует в indexeddb.
  • if present
    • Get the image from the indexeddb and put it in the image tag
  • if not present
    • Download it
    • сохранить его в indexeddb
    • поместите изображение в тег изображения.

В качестве дополнительного (в будущем) вы можете сделать, как описано Сев: проверьте тип соединения и загрузите изображение только при работе на быстром интернет-соединении.

person Kristof Degrave    schedule 19.10.2012
comment
Checkout PouchDB, абстракция нескольких постоянных веб-серверов. Таким образом, вам не нужно беспокоиться о наилучшем подходе для браузера посетителя. - person Brenden; 12.08.2016

Я «изобрел» рабочее решение для разработки веб-приложения на iPad (iOS 6.0.x), которое может ответить на ваш вопрос.

Идея состоит в том, чтобы сначала проверить, установлена ​​ли/определена переменная localstorage или еще нет (я использую заголовок страницы, таким образом, имя веб-приложения).

Если эта переменная localstorage существует, то предположим (в контексте песочницы веб-приложения), что это первый раз, когда приложение запускается. На этом этапе я заполняю UUID в сочетании с $PHP_SESSION($uuid), чтобы избежать «заражения между приложениями» на стороне PHP на стороне сервера. В дополнение к этому у меня есть динамический файл manifest.appcache.php, который включает в себя в разделе КЭШ список файлов для добавления в манифест. Таким образом;

<?
echo $manifest_file_list[0]."\n";
?>

Используя прослушиватели событий манифеста JS appcache, я затем отслеживаю прогресс до чего-то вроде $('#manifestappcache').html(result);

person vivvvi    schedule 18.05.2013