Уеб приложение за iOS - как да се справим с прекаленото кеширане на приложения?

През последния месец разработвах доста сложно HTML5 уеб приложение. Снощи моят iPhone внезапно реши да кешира всички JS, CSS и изображения и да не зарежда никакви актуализирани копия. Това се случи и на iPhone на моя партньор, така че ще предположа, че засяга всички потребители на нашето приложение.

Излишно е да казвам, че изчистването на кеша на браузъра, изтриването на уеб приложението, рестартирането на телефона и рестартирането на безжичната връзка не правят нищо за отстраняване на проблема.

Премахването на <meta name="apple-mobile-web-app-capable" content="yes"> решава проблема, но създава нов проблем, тъй като имаме нужда приложението да работи като... приложение.

Ние също няма да обикаляме и добавяме стария трик ?number в края на всички наши скриптове, таблици със стилове и изображения. Това е смешно. Освен това -- ако трябваше да внедрим нещо подобно, то трябва да е някакво динамично изпълнение на JS. Нашето приложение е една HTML страница, която зарежда повечето скриптове, а допълнителните страници са AJAX, допълнителни данни също се получават чрез AJAX. Предполагам, че това може да се направи, но се надявам на по-елегантно решение. Знаете ли, чувствам, че не трябва да правя нищо, тъй като всичко това работи безпроблемно цял месец.

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

Изглежда, че много потребители на SO са се сблъскали с този проблем, но не мога да намеря никакви задоволителни решения. Някой там в подобна ситуация разрешил ли е този проблем? Мога ли да използвам манифестен файл, за да укажа не за кеширане на няколко файла? Изглежда, че манифестните файлове се използват, за да направят обратното.


person Ben Y    schedule 10.07.2013    source източник
comment
потвърдено, че все още е (огромен) проблем в iOS7   -  person bart s    schedule 20.09.2013
comment
Използвате ли HTML кеш на приложения? Ако не, може да успеете да „измамите“ кеша на уеб приложението на iOS да изхвърли кеша, като създадете манифест на appcache с файловете, които трябва да актуализирате. След това, когато трябва да направите промени и да тествате промените, деактивирайте манифеста, като промените името на файла на манифеста на вашия уеб сървър. Това обезсилва съхранения манифест и кешираните файлове, тъй като манифестът на сървъра не може да бъде намерен.   -  person BigMacAttack    schedule 20.09.2013
comment
Не използва кеш на приложения, нито използва манифест. Уеб приложението се използва в "производствена" среда. Не е възможно да направим актуализация на нашата система някъде в съществуваща инсталация и да променим име на файл, за да излъжем кеша. В моята среда за разработка мога лесно да добавя някакъв номер към името на файла за тестване, но както казва OP, това не може да става в производствена среда   -  person bart s    schedule 23.09.2013
comment
И аз съм имал това, ако отворя URL адреса в Safari, той зарежда най-новия JS. Веднага след като го добавя към началния екран като уеб приложение, той отново започва да използва стария JS. Ужасно.   -  person Adam Marshall    schedule 02.01.2014


Отговори (1)


Колкото и да си струва и не е идеалното решение, трябваше да се задоволим с добавяне на низове на заявки. Написах шел скрипт, за да направя тази и няколко други задачи малко по-автоматизирани, можете да погледнете източника на GitHub. Малко подробности:

  • Той е проектиран за JS, но може лесно да се редактира, за да работи и с CSS.
  • Той взема всички файлове, изброени в script_order.txt, и ги компилира с Closure Compiler на Google
  • Групира ги в части под 25 kb, когато е възможно (iPhone няма да кешира нищо над 25 kb преди gzip, въпреки че очевидно това се простира само до браузъри, а не до самостоятелни уеб приложения)
  • Извежда PHP файл с <script> тагове, които имат ?v=timestamp, добавен към имената на файловете на скрипта. Ако работите със статичен HTML и не можете да включите PHP файл, можете да пренапишете изхода, за да добавите маркерите на скрипта към вашия файл index.html.

Друго доста хакерско решение би било да запишете вашия JS/CSS с файлово разширение .php и в тези файлове да зададете заглавките на нещо подобно:

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

РЕДАКТИРАНЕ:

Задаване на датата на 2, 3 или 4 дни в бъдещето, стартиране на приложението от началния екран и след това задаване на нормалната дата също може да свърши работа.

person Ben Y    schedule 22.09.2013
comment
Сигурни ли сте, че отговорът ви има нещо общо с въпроса? Не знам за OP, но нямам PHP уеб сървър. Времевите клейма могат лесно да се добавят към имената на файловете с помощта на javascript. Въпросът ясно казва We're not going to go around appending the old trick ?number to the end of all our scripts, stylesheets, and images either. That's ridiculous. - person bart s; 23.09.2013
comment
@bart-s Аз съм ОП. Както казах, трябваше да се спрем на низа на заявката, въпреки че не исках. Разбира се, лесно е да добавите времеви отпечатъци с JS, но скриптът на обвивката може поне да помогне за автоматизиране на процеса на внедряване в много системи за разработка и сценични/производствени среди. PHP не е необходим тук. Просто хвърлях моето решение там, в случай че можете да изберете полезни части от него, но очевидно не беше така. Повярвай ми, чувствам болката ти. - person Ben Y; 23.09.2013
comment
Сигурно съм пропуснал, че ти си ОП. Кеширането е абсурдно. Дори ако можете да оправите нещата в браузъра, запазването на началния екран пак ще извади нещата от кеша. Намерих още един трик за настройка на датата в бъдещето. Добавено към вашия отговор, за да ми позволи да изтрия -1 - person bart s; 23.09.2013
comment
Няма грижи човече. Наистина е жалко - не трябва да прибягваме до хитри малки решения, за да накараме нещо толкова стандартно да работи на такова стандартно устройство. Благодаря, че сподели трика си, ще го пробвам. - person Ben Y; 23.09.2013
comment
Задаването на датата в бъдещето и след това отново ми свърши работа, благодаря ти, bart s :) - person Adam Marshall; 02.01.2014
comment
Обърнете внимание, че трикът с датата може да бъде полезен при разработването, но няма да помогне на вашите потребители, освен ако не очаквате те сами да направят трика с датата. - person Ben Y; 03.01.2014