кеш приложения для iPhone и XMLHttpRequest - PullRequest
0 голосов
/ 22 января 2010

У меня есть веб-приложение, которое я пытался заставить работать в автономном режиме. WebApp слишком велик, даже минимизирован, чтобы просто использовать кеш приложения (вещи загружаются, но я в итоге получаю ошибку window.applicationCache). Я пытаюсь использовать XMLHttpRequest, чтобы получить более крупные сценарии и основной html, сохранить их в localStorage и просто сохранить небольшой скрипт загрузчика в кэше приложения. Проблема, которую я вижу, состоит в том, что XMLHttpRequest возвращает сетевую ошибку, когда скрипт загрузчика обслуживается локально. При загрузке кеша ошибка не возвращается и она работает нормально. Когда я отключаю кеш приложения, загрузчик работает нормально, но, конечно, мне нужна сеть, чтобы получить загрузчик.

Я пытался setRequestHeader("Cache-Control", "no-cache"), но это не помогло.

У кого-нибудь есть подсказка?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Как выглядит ваша сеть: раздел в манифесте?

Я обнаружил, что если бы я не разрешал подстановочный сетевой трафик, он не загружался бы с XMLHttpRequest. Так что изменив его на:

Сеть: *

сделал трюк для нас.

1 голос
/ 25 января 2010

Я думаю, что нашел решение. Это, вероятно, будет работать для других.

Я разделил загрузчик на два отдельных файла HTML: один, который использует XMLHttpRequest, чтобы получить все необходимые файлы и поместить их в localStorage (загрузчик), а другой, который просто читает файлы из localStorage и записывает их в документ (загрузчик ) с соответствующими обертками (например). У загрузчика есть файл манифеста, который хранит его в кэше приложения. Загрузчик нет. Пользователь сначала вызывает загрузчик. Если загрузчик находит файлы уже в localStorage, он делает свое дело. В противном случае он использует location.replace () для вызова загрузчика. Загрузчик загружает файлы с сервера с помощью XMLHttpRequest и помещает их в localStorage, а затем повторно вызывает загрузчик с помощью location.replace (). Кажется, это не вызывает ошибку сети.

Чтобы работать в автономном режиме, пользователь должен вызвать загрузчик в браузере iPhone Safari (который вызывает загрузчик, который повторно запускает загрузчик), который загружает WebApp. В Safari пользователь должен затем добавить WebApp (ссылку на загрузчик) на свой главный экран (с помощью кнопки «+» внизу). В автономном режиме пользователь может получить доступ к приложению с помощью значка главного экрана. Повторная визуализация занимает несколько секунд, но после этого она становится полностью функциональной. Это та же задержка, когда онлайн. Вызов ссылки из браузера iPhone Safari не будет работать в автономном режиме, хотя он будет работать в Интернете.

Загрузчик отслеживает событие «updateready» кэша приложения, чтобы при подключении к сети и при обнаружении iPhone изменения файла манифеста загрузчика и загрузке нового загрузчика он заменял новый кэш (window.applicationCache.swapCache ()) и снова вызовите загрузчик с помощью location.replace (). Я также добавляю alert (), чтобы пользователь знал, что происходит что-то интересное. Таким образом, изменение файла манифеста (я имею в виду изменение некоторых байтов, а не просто изменение времени изменения) приведет к тому, что клиенты будут получать новые файлы при подключении к сети.

Интересно, что я заметил, что localStorage, настроенный в Safari, недоступен для той же страницы, что и при вызове значка Начального экрана, даже если файлы cookie передаются! Таким образом, при первом запуске загрузчика с иконки он перезагрузит файлы, даже если они были ранее загружены в Safari. Кроме того, мне пришлось явно запретить кэширование загрузчика, поскольку он не перезагружался с сервера, когда обновлялись остальные файлы.

0 голосов
/ 12 октября 2011

Вы правы. В конечном итоге это был сетевой раздел в манифесте.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...