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

Не удается получить доступ к файлам с явным кэшем с помощью 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() или что? Любая помощь приветствуется.

4b9b3361

Ответ 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