Подтвердить что ты не робот

IOS Web App - как бороться с чрезмерным кэшированием приложений?

Я занимаюсь разработкой довольно сложного веб-приложения HTML5 за последний месяц. Вчера вечером мой iPhone внезапно решил кэшировать все JS, CSS и изображения и не загружать обновленные копии. Это случилось и с моим партнером iPhone, поэтому я собираюсь предположить, что это затрагивает всех пользователей нашего приложения.

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

Удаление <meta name="apple-mobile-web-app-capable" content="yes"> решает проблему, но создает новую проблему, так как нам нужно, чтобы приложение запускалось как... приложение.

Мы не собираемся добавлять старый трюк ?number в конец всех наших скриптов, таблиц стилей и изображений. Это смешно. Также - если бы мы реализовали что-то подобное, это должно было быть своего рода динамической реализацией JS. Наше приложение представляет собой одну HTML-страницу, которая загружает большинство сценариев, а дополнительные страницы - AJAXed, дополнительные данные также получают через AJAX. Я думаю, это можно сделать, но я надеюсь на более элегантное решение. Я знаю, я чувствую, что мне не нужно ничего делать, так как все это работало без сучка и надолго целый месяц.

Использование тегов cache-control, expires и pragma <meta> тоже не приносит нам пользы, так как это просто проблема веб-приложения iOS. Кэширование работает обычно в мобильных Safari, мобильных Chrome и всех настольных браузерах. Похоже, что у iOS есть отдельный кеш для приложений, включая веб-приложения, которые пользователь не может очистить.

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

4b9b3361

Ответ 1

Для чего это стоит, и это не идеальное решение, нам пришлось довольствоваться добавлением строк запроса. Я написал оболочку script, чтобы сделать это и несколько других задач более автоматизированными, вы можете посмотреть источник на GitHub, Несколько деталей:

  • Он предназначен для JS, но может быть легко отредактирован для обработки CSS.
  • Он принимает все файлы, перечисленные в script_order.txt, и компилирует их с помощью Google Closure Compiler
  • Объединяет их в куски под 25 КБ, когда это возможно (iPhone не будет кэшировать что-либо более 25 КБ pre-gzip, хотя, по-видимому, это распространяется только на браузеры, а не на автономные веб-приложения)
  • Выводит файл PHP с тегами <script> с ?v=timestamp, добавленным к именам файлов script. Если вы работаете со статическим HTML и не можете включить PHP файл, вы можете переписать вывод, чтобы добавить теги script в файл index.html.

Еще одно довольно хакерское решение - сохранить JS/CSS с расширением файла .php, а в этих файлах установить заголовки примерно так:

<?php
header("content-type: application/javascript");
header('Cache-Control: no-cache');
header('Pragma: no-cache');
?>
window.alert('hello world');

EDIT:

Установка даты на 2, 3 или 4 дня в будущем, запуск приложения с рабочего стола, а затем установка даты в нормальное состояние также может сделать трюк.