2012-03-21 9 views
5

Kullanıcıların SVG lezyonu görmenizi sağlayan web uygulaması var. Bu SVG'ler genellikle göreceli bir url kullanılarak yüklenen görüntüleri içerir. Bu bir iPad 'web uygulaması' olmak istiyorum gibi biz de iPad kullanıcının Ana ekrana eklenmesini istediğiniz ve HTML 5 uygulama önbelleği tarafından önbelleğe için kullanıcının bu SVG açıklığı ve ilgili görüntüleri çevrimdışı olarak görüntülemek böylece. Bizim uygulama iPad ana sayfası simgesinden yüklendiğindeÖnceden iPad'de önbelleğe alındığında neden SVG'lerde görüntüler uygulama önbelleğinden yüklenmez?

, uygulama önbelleği tezahür doğru okunur ve başvurulan kaynakların tümünü önbelleğe alınır. Sorun, kullanıcı uygulamayı çevrimdışı kullanmaya başladığında ortaya çıkar. Uygulamanın kullanımı sırasında SVG'ler eklenir ve sayfa DOM'den kaldırılır. Bu sırada, SVG'deki bazı görüntüler kesinlikle mevcut ve önbelleğe alınmış olsalar bile uygulama önbelleğinden yüklenemez. Bunun yerine, görüntü artık çevrimiçi olmadığı için sunucuya bir istekte bulunulduğu açıktır.

İlginçtir ki, iPad'deki bir sayfada gezinirken bu sorun oluşmuyor. Tam sayfa web uygulaması görünümüne özgü gibi görünüyor, ancak bunu garanti edemiyorum.

Ben oldukça kolay bu HTML sayfasını kullanarak bu üretebilir:

<!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> 

Bu 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 tarafından başvuruda bulunulan Bu görüntü:

The image referenced by the SVG

Ve bu bildirim dosyası:

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

Ve ardından bu adımlarla:

  1. Açık safari ve (biz Windows 2008/IIS sunucuda barındırmak) üreme html dosyasının konumuna gidin
  2. sayfa ekle Ana Ekran 'Ana Ekrana Ekle' düğmesini kullanarak.
  3. Kapat safari ve sayfa tamamen önbelleğe kadar safari önbelleği
  4. Yük yeni
  5. bekleyin imi eklenmiş gelen sayfa temizlemek. Genellikle yaklaşık 5-10 sn, ancak bazı uygulama önbellek olaylarına ekleyerek ilerlemenin kesilmesi istenir.
  6. sayfa doğru önbelleğe görünüyor o
  7. Bildirimi imi yeni eklenen gelen wifi (ya da ne hiç kullandığınız bağlantının anlamına gelir)
  8. Yük sayfası kapatın
  9. . Ekle ve kaldır düğmelerini kullanın. Oldukça hızlı bir şekilde, sayfadaki 'ekle' düğmesini kullanarak eklediğinizde dikkat etmelisiniz. SVG'deki resim kaynağı, önbelleğe alınmış olsa bile, uygulama önbelleğinden her zaman yüklenmez.

    • Uygulama önbellek tezahür doğru vardır: Sorun oluştuğunda,

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

      aşağıdaki ekran görüntüsü gibi bir şey göreceksiniz

Zaten bazı bariz şeyler kontrol ettim MIME Tür

  • Bildirinin tamamı
  • Resourc Bu durumda neden

    • bilen var mı: manifest'te başvurulan es

    Benim sorulara

  • olan doğru önbelleğe alınır?
  • Bu sorunla ilgili bir çözüm var mı?
  • Bunu elma ile ilgili bir hata olarak günlüğe kaydettim, bu yüzden bu sorunun cevabını onlardan alabilirim!

    Teşekkürler!

    Andy.

    +0

    iOS ana sayfası uygulamaları hala iOS Safari için WebKit'in farklı bir sürümünü kullanıyor mu, yoksa bunu düzelttiler mi? Çözümler gelince: JS ve/veya HTML önbelleğe alma doğru mu? Resimlerinizi veri URL'leri olarak kodlar mısınız? – robertc

    +0

    Hey, önerileriniz için teşekkürler, JS ve HTML hem önbelleğe alma, hem de HTML sayfasındaki SVG içindeki uygulama önbelleğinden alınmayan görüntü. iOS ana sayfası uygulamaları ve iOS safari ile ilgili olarak aslında bilmiyorum. Biraz farklı bir versiyon kullandıklarını veya aralarında farklı bir şey olduğunu tahmin ediyordum ama ne olduğunu bilmiyorum. Öğrenmenin bir yolu var mı (kitlesel bir iOS yanlısı değilim!). Eğer mümkünse aynı görüntüye sahip birden fazla SVG'imiz varsa (arka plan veya başlık belki de) verimsiz olacağından veri URL'lerini denemek ve önlemek isteriz. – Andy

    +0

    Aslında bunu düşünürsek, webkit sürümünü isteğin başlığından alabilir miyiz? ... Biraz zamanım olduğunda bakmam gerekecek! – Andy

    cevap

    0

    Sadece küçük bir "kafa doldu!" Bu soruna kafa yoruyorsanız, bir saat öncesine kadar ...:

    Bildiri dosyası büyük/küçük harfe duyarlıdır.

    Masaüstü, tablet ve akıllı telefonlarda kullanılmak üzere tasarlanmış bir web sitem var. Android'de (4.0.3), HTML 5 Uygulama Önbelleğini etkinleştirdikten sonra, yukarıdaki durumunuzdaki gibi SVG simgeleri başarısız olmaya başladığını fark ettim. Kullanıcı sayfayı yenilediğinde (ve simgeler önbellekten getirilmeye çalışıldığında) kırık bağlantılar olarak görünür.

    Klasör adıma SVG simgelerine yanlış bir durumda bir harf yazdım ve bu sorunu gidermek hemen sorunu çözdü.

    +1

    Sorun bu değil, önbellek manifestosunun doğru olduğunu söyleyemem, çünkü eğer durum yanlışsa (bunu geçmişte de yaşadım). Durumum, SVG'deki görüntülerin önbelleğe alındığını, ancak her zaman önbellekten alınmadığını gösterir. Tüm SVG'yi gömme yerine satır içine koyarsam, mükemmel çalışır. Sanırım gömülü etiketle bir hata olmalı. – Andy

    +0

    Ayrıca, önbellek bildirimi programlı olarak oluşturulmuştur, bu durumda durum gerçekten doğru olmalıdır! :) – Andy

    İlgili konular