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 столкнулись с этой проблемой, но я не могу найти удовлетворительных решений. Кто-нибудь там, в подобной ситуации, решил эту проблему? Могу ли я использовать файл манифеста, чтобы указать, чтобы не кэшировать несколько файлов? Кажется, что файлы манифеста используются для противоположного.
Ответы
Ответ 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 дня в будущем, запуск приложения с рабочего стола, а затем установка даты в нормальное состояние также может сделать трюк.