Почему изображения в SVG-файлах не всегда загружаются из кэша приложения, если они ранее кэшировались на iPad? - PullRequest
5 голосов
/ 21 марта 2012

У нас есть веб-приложение, которое позволяет пользователям просматривать SVG.Эти SVG обычно содержат изображения, которые загружаются с использованием относительного URL.Поскольку мы хотим, чтобы это было «веб-приложение» для iPad, мы также хотим, чтобы оно добавлялось на домашний экран пользователя iPad и кэшировалось в кэше приложения HTML 5, чтобы пользователь мог просматривать эти SVG и связанные изображения в автономном режиме.

Когда наше приложение загружается с иконки домашней страницы iPad, манифест кэша приложения читается правильно, и все ссылочные ресурсы кэшируются.Эта проблема возникает, когда пользователь начинает использовать приложение в автономном режиме.Во время использования приложения SVG добавляются и удаляются со страницы DOM.Во время этого некоторые изображения в SVG не могут быть загружены из кэша приложения, даже если они определенно присутствуют и кэшируются.Вместо этого на сервер отправляется запрос изображения, который, очевидно, не выполняется, поскольку пользователь больше не подключен к сети.

Интересно, что эта проблема, по-видимому, не возникает при переходе на страницу в сафари наIPAD.Кажется, что он специфичен для представления веб-приложения на всю страницу, хотя я не могу этого гарантировать.

Я могу довольно легко воспроизвести это, используя эту HTML-страницу:

<!DOCTYPE html>
<html manifest="testfiles.manifest">
<head>
    <title>Test</title>

    <script src="Javascript/jquery-1.7.1.js" type="text/javascript"></script>

    <!-- Remove the browser chrome when the page is loaded from a homescreen icon -->
    <meta name="apple-mobile-web-app-capable" content="yes" />

</head>
    <body>

        <h1>Simple SVG caching test</h1>

        <h2>Basket ball SVG</h2>

        <p>
            <span id="remove">Remove</span> | <span id="add">Add</span>
        </p>

        <p>
            <span id="show">Show</span> | <span id="hide">Hide</span>
        </p>

        <p>
            <span id="reload">Reload</span>
        </p>

        <embed width='360' height='510' src='TestFiles/Basketball.svg' />

        <script type="text/javascript">
            $(function ()
            {
                $("#remove").click(function ()
                {
                    $("embed").remove();
                });

                $("#add").click(function ()
                {
                    $("<embed width='360' height='510' src='TestFiles/Basketball.svg' />").appendTo("body");
                });

                $("#show").click(function ()
                {
                    $("embed").show();
                });

                $("#hide").click(function ()
                {
                    $("embed").hide();
                });

                $("#reload").click(function ()
                {
                    location.reload(true);
                });

            })
        </script>

    </body>
</html>

Этот SVG:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg

   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   width="340"
   height="340">

  <image
     width="340"
     height="340"
     xlink:href="Basketball.png"
     x="0"
     y="0" />

</svg>

Это изображение, на которое ссылается SVG:

The image referenced by the SVG

И этот файл манифеста:

CACHE MANIFEST
CACHE:
TestFiles/Basketball.svg
TestFiles/Basketball.png
Javascript/jquery-1.7.1.js

И следующимэти шаги:

  1. Откройте Safari и перейдите к расположению файла воспроизведения html (мы размещаем его на сервере Windows 2008 / IIS)
  2. Добавьте страницу на главный экран, используякнопка «Добавить на главный экран».
  3. Закрыть сафари и очистить кэш сафари
  4. Загрузить страницу из недавно добавленной закладки
  5. Подождите, пока страница полностью не будет кэширована.,Обычно около 5-10 секунд, но вы можете прикрепить к некоторым событиям кэша приложения, чтобы выйти из системы.
  6. Отключить Wi-Fi (или какой-либо другой способ подключения, который вы используете)
  7. Загрузитьстраница из недавно добавленной закладки
  8. Обратите внимание, что страница выглядит правильно кэшированной.Используйте кнопки добавления и удаления.Вы должны заметить довольно быстро, что, когда вы добавляете, используя кнопку «Добавить» на странице.Ресурс изображения в SVG не всегда загружается из кэша приложения, даже если он явно кэширован.

Когда возникает проблема, вы должны увидеть что-то вроде снимка экрана ниже

Screenshot of an SVG with an image failing to load the image from the application cache

Я уже проверил некоторые очевидные вещи:

  • Манифест кэша приложения имеет правильный тип MIME
  • Манифест загружен
  • Ресурсы, указанные в манифесте, кэшируются правильно

Мои вопросы:

  • Кто-нибудь знает, почему это происходит?
  • Есть ли какие-либо обходные пути к этой проблеме?

Я зарегистрировал это как ошибку с яблоком, поэтому я обновлю этот вопрос с любыми отзывами, которые я могу получить от них!

Спасибо!

Энди.

1 Ответ

0 голосов
/ 22 июня 2012

Просто маленькая "голова поднята!" если вы обдумываете эту проблему, как я делал это до часа назад ...:

Файл манифеста чувствителен к регистру.

У меня есть веб-сайт, предназначенный для использования на настольных компьютерах, планшетах и ​​смартфонах. На Android (4.0.3) я заметил, что после включения кеша приложений HTML 5 мои SVG-иконки начали давать сбой, как и в вашем случае выше. Они отображаются как неработающие ссылки, когда пользователь обновляет страницу (и при попытке загрузки значков из кеша).

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

...