5

ユーザーが SVG を表示できる Web アプリケーションがあります。これらの SVG には通常、相対 URL を使用して読み込まれる画像が含まれています。これを iPad の「Web アプリ」にしたいので、これを iPad ユーザーのホーム画面に追加し、HTML 5 アプリケーション キャッシュによってキャッシュして、ユーザーがこれらの SVG と関連する画像をオフラインで表示できるようにします。

アプリケーションが iPad のホームページ アイコンから読み込まれると、アプリケーション キャッシュ マニフェストが正しく読み取られ、参照されているすべてのリソースがキャッシュされます。この問題は、ユーザーがアプリケーションをオフラインで使用し始めたときに発生します。アプリケーションの使用中に、SVG が追加され、ページ DOM から削除されます。この間、SVG 内の一部の画像は、アプリケーション キャッシュから確実に存在してキャッシュされているにもかかわらず、アプリケーション キャッシュからの読み込みに失敗します。代わりに、サーバーに対して画像の要求が行われますが、ユーザーがオンラインではないため、明らかに失敗します。

興味深いことに、この問題は、iPad のサファリでページに移動するときには発生しないようです。保証はできませんが、フル ページの Web アプリ ビューに固有のようです。

この 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 によって参照されるこの画像:

SVG が参照する画像

そして、このマニフェスト ファイル:

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

そして、次の手順に従ってください。

  1. Safari を開き、複製 html ファイルの場所に移動します (Windows 2008 / IIS サーバーでホストされています)。
  2. [ホーム画面に追加] ボタンを使用して、ページをホーム画面に追加します。
  3. Safari を閉じて、Safari キャッシュを消去します
  4. 新しく追加されたブックマークからページを読み込む
  5. ページが完全にキャッシュされるまで待ちます。通常は約 5 ~ 10 秒ですが、一部のアプリケーション キャッシュ イベントにアタッチしてログアウトの進行状況を確認することもできます。
  6. Wi-Fiをオフにする(または使用する接続手段をすべてオフにする)
  7. 新しく追加されたブックマークからページを読み込む
  8. ページが正しくキャッシュされているように見えることに注意してください。追加および削除ボタンを使用します。ページの「追加」ボタンを使用して追加すると、すぐに気付くはずです。SVG の画像リソースは、明らかにキャッシュされているにもかかわらず、常にアプリケーション キャッシュから読み込まれるわけではありません。

問題が発生すると、以下のスクリーン ショットのようなものが表示されます。

アプリケーション キャッシュからの画像の読み込みに失敗した画像を含む SVG のスクリーンショット

私はすでにいくつかの明白なことをチェックしました:

  • アプリケーション キャッシュ マニフェストの MIME タイプが正しい
  • マニフェストがダウンロードされます
  • マニフェストで参照されるリソースは正しくキャッシュされます

私の質問は次のとおりです。

  • なぜこれが起こるのか誰か知っていますか?
  • この問題の回避策はありますか?

これをアップルのバグとして記録したので、彼らから得たフィードバックでこの質問を更新します!

ありがとう!

アンディ。

4

1 に答える 1

0

ほんの小さな「頭が上がった!」1時間前までのように、この問題について熟考している場合は...:

マニフェストファイルでは大文字と小文字が区別されます。

デスクトップ、タブレット、スマートフォンの両方で使用できるように設計されたWebサイトがあります。Android(4.0.3)で、HTML 5 App Cacheを有効にした後、上記の場合と同じように、SVGアイコンが失敗し始めたことに気づきました。ユーザーがページを更新すると(アイコンがキャッシュからフェッチされようとすると)、リンク切れとして表示されます。

間違ったケースでフォルダ名にSVGアイコンに文字を書き込んでいたのですが、これを修正するとすぐに問題が修正されました。

于 2012-06-22T11:53:37.930 に答える