Не удается получить доступ к файлам с явным кэшем с помощью AJAX из webapp, сохраненных на главный экран в устройствах iOS, используя jQuery.ajax()
Я делаю webapp. Некоторые из загружаемых файлов содержат чистые статические данные .JSON. Я использую jQuery.ajax() (jQuery 1.5.2) с dataType: 'json' и cache: true. Все работает хорошо, и все файлы загружаются. Я также настроил манифест кэша для кэширования этих файлов JSON (в дополнение к css, js и изображениям). Там все хорошо работает - когда пользователь посещает мой сайт, все файлы, которые мне нужны, кэшируются правильно (у меня есть обработчики событий ApplicationCache, которые подтверждают, что все хорошо). Я тестировал все в Google Chrome, и я вижу, что все файлы (включая JSON) кэшируются. Когда я отключусь от сети, все работает (jQuery ajax вызывает автоматическое извлечение кэшированных файлов JSON).
Теперь я пытаюсь проверить это на мобильном Safari (на реальном iPad и симуляторе iPhone). Все работает так, как ожидалось, когда в Safari - страницы кэшируются и при последующих посещениях с отключенной сетью используются кэшированные файлы.
Однако, когда я добавляю приложение на Домашний экран, используя "добавить на главный экран" в Safari, приложение запускается, и все .js,.css и изображения работают правильно, НО мои вызовы Ajax не делают! Они не имеют доступа к кэшированным файлам .json. Для каждого вызова Ajax XMLHttpRequest.status
равен 0
, .statusText
- error
, но getAllResponseHeaders()
показывает те же (правильные) заголовки, что и в функциональном приложении в Safari.
Я не понимаю. Это ограничение/ошибка в jQuery.ajax() или что? Любая помощь приветствуется.
Ответы
Ответ 1
Ну, я не хочу отвечать на свой вопрос, но вот что я сделал, если кто-то другой столкнулся с этой проблемой:
По-видимому, при попытке использовать $.ajax() в автономном режиме запрос успешно извлекает кешированные файлы, но возвращает 0 на XHMLHttpRequest.status. Прочитав это, я увидел, что код состояния 0 может быть возвращен, когда пользователь находится в автономном режиме и даже при запросе локальных файлов. Однако успешное GET должно сообщать код состояния от 200 до 300. Возможно, $.ajax() проверяет статус 200-300, в противном случае запрос считается неудачным.
Чтобы обойти это, я добавил код в свой обработчик ошибок для запроса $.ajax()
, который проверяет jqXHR.responseText.**length**
. Я знаю правильное количество символов в своих файлах JSON, поэтому, если jqXHR.responseText.length
совпадает с этим известным значением, я считаю запрос успешным и продолжаю загрузку файлов. Единственное, что мне нужно сделать, это добавить JSON.parse(jqXHR.responseText)
в обработчик ошибок, потому что данные не обрабатываются кодом состояния 0.
Ответ 2
Еще один способ сделать это (особенно, если вы поклонник jQuery) - это использовать метод jQ Ajax и не использовать кеш:
cache:false,
Очевидно, что ajax не сможет загружать данные на стороне сервера в автономном режиме, поэтому почему бы не проверить, включен ли он в режиме онлайн, и если да, то вперед и извлеките данные:
if(navigator.onLine) { //if user online
var data = 'data=' + randomVar;
$.ajax({
url: "url.php",
type: "POST",
timeout:45000, //45 secs
data: data,
cache: false,
error: function () { alert("error: 45 secs have passed since request was sent. No data was returned - too slow internet connection or some other random error."); },
success: function (responseText) {
// do whatever if successful
}
});
} // if online