Есть ли способ запросить кеш приложения HTML5?

Есть ли способ запросить содержимое кеша приложения HTML5?

Я пишу приложение для iOS, которое использует много кэшированного веб-контента. Перед загрузкой данной страницы, когда приложение находится в автономном режиме, я хотел бы проверить, существует ли страница в кеше. Если этого не произойдет, я уведомлю пользователя о том, что он должен быть в сети, чтобы увидеть этот контент; если это произойдет, я пойду вперед и загрузить его.

Теперь в iOS есть собственная система кеширования URL-адресов, и я изначально просто предполагал, что смогу проверить содержимое кеша таким образом:

if ([[NSURLCache sharedURLCache] cachedResponseForRequest:myRequest] != nil) {
    // go ahead and load the page
}
else {
    // notify the user that the content isn't available
}

Я такой глупый. Кажется, что кеш iOS и кеш HTML5 не связаны: -cachedResponseForRequest: возвращает nil для любого запроса, даже когда я вижу, что URL-адрес находится в кеше приложения HTML5 (с помощью веб-отладчика Safari).

Итак, есть ли способ, которым я могу запросить содержимое кеша приложения HTML5? Не имеет значения, использует ли ответ код Objective-C или Javascript, поскольку я всегда могу просто выполнить соответствующий JS из цели-C.


person Caleb    schedule 20.01.2013    source источник
comment
Операции кеша приложения HTML5 являются атомарными — если файл указан в манифесте и кеш существует, файл гарантированно будет в кеше. В вашей ситуации вы ожидаете, что файлы, не указанные в манифесте, будут добавлены в кэш приложений?   -  person robertc    schedule 20.01.2013
comment
@robertc Спасибо за это. Я не ожидаю дополнений к кешу, но манифест время от времени меняется, и кеш обновляется соответствующим образом.   -  person Caleb    schedule 20.01.2013
comment
Хорошо, есть некоторые другие факторы, о которых стоит упомянуть, я скоро напишу «правильный» ответ.   -  person robertc    schedule 20.01.2013


Ответы (2)


Есть два свойства HTML5 AppCache, которые означают, что при нормальной работе в этом нет необходимости:

  1. Операции обновления AppCache являются атомарными, либо обновляется весь кеш, либо не обновляется ни одна его часть.
  2. После создания AppCache все файлы, находящиеся в кеше, обслуживаются из кеша.

Конечным результатом является то, что для любой данной версии файла манифеста любой файл, указанный в нем, который загружается в браузер, будет согласован со всеми другими файлами, перечисленными в манифесте. Все, что вам нужно проверить, это window.applicationCache.status и убедитесь, что это не UNCACHED.

Есть еще одна возможность. Если вы «лениво добавляете» файлы в AppCache, как описано в Погружение в HTML5, это может быть, что вы не уверены, какие файлы кэшируются. В этом случае вы можете адаптировать один из подходов для определения онлайн-состояния, я не собираюсь давать вам полностью проверенный решение, но вот общая идея:

  1. Создайте веб-страницу, содержащую уникальный идентификатор, который вряд ли когда-либо будет нормально отображаться на странице. Идентификатор может находиться в скрытом содержимом обычной страницы.
  2. Установите эту страницу как общую FALLBACK в своем манифесте.
  3. Запросить страницы с помощью AJAX.
  4. Сканируйте ответ на наличие уникального идентификатора, если вы его найдете, значит, запрошенная страница отсутствует в AppCache.
person robertc    schedule 20.01.2013
comment
Спасибо, что нашли время ответить. Это гибридное приложение для iOS, в котором нативная часть представляет собой контейнер, мало что знающий о содержимом. Веб-контент кэшируется, поэтому приложение работает, даже если устройство не имеет доступа к сети. Я могу легко обнаружить отсутствующее соединение, но я хотел бы обрабатывать некоторые ошибки, такие как 404 из некэшированного контента, в первую очередь предотвращая загрузку некэшированных ссылок. Я ищу способ определить, находится ли данная страница в манифесте кеша, если не загружать и анализировать ее самостоятельно. - person Caleb; 20.01.2013
comment
@Caleb Я не описывал, как обнаружить отсутствующее соединение, я описал, как обнаружить отсутствующий файл. Вам не нужно анализировать файл, просто найдите в нем свой уникальный идентификатор. Если вы настроите его так, как я предложил, вы не получите никаких ошибок 404, только резервную страницу. - person robertc; 21.01.2013

Да, кеш хранится в Application.db.

person unbuglee    schedule 20.02.2013