21 Stimmen

HTML5 - Cache-Manifest funktioniert gut in Chrome, aber nicht in Firefox und Opera

Ich entwickle eine Webanwendung für die Offline-Nutzung, daher muss ich die Cache-Funktion der Anwendung nutzen.

In Chrome (15.0.874.106) funktioniert alles einwandfrei, aber in Firefox (7.0.1) und Opera (11.52) funktioniert es nicht.

Dies ist meine Cache-Manifest-Datei cache.manifest.php (Ich habe sie auf das absolute Minimum reduziert):

<?php 
    header("Cache-Control: max-age=0, no-cache, no-store, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: Wed, 11 Jan 1984 05:00:00 GMT");
    header('Content-type: text/cache-manifest');
?>CACHE MANIFEST

CACHE:

/app/common/css/reset.css
/favicon.ico

Und dies sind die ersten 4 Zeilen des "Haupt"-HTML-Dokuments:

<!DOCTYPE html> 
<html manifest="/app/mobile/cache.manifest.php"> 
    <head> 
    <title>MyApp Mobile</title> 

Wenn ich versuche, das Cache-Manifest (http://www.myapp.com/app/mobile/cache.manifest.php) in den Browser zu laden, wird die Datei korrekt angezeigt, aber wenn ich versuche, die Seite offline zu laden, erhalte ich die Fehlerseite "Unable to connect". Auch das passiert nur bei Firefox und Opera.

Firebug sagt " 0 items in offline cache "und ich habe keine Möglichkeit gefunden, den Anwendungscache auf DragonFly zu überprüfen.

Ich werde langsam wütend und weiß nicht, wie ich das Problem in Firefox und Opera effektiv beheben kann. Bitte helfen Sie mir.

Danke! Dan

15voto

AshleysBrain Punkte 21511

Meiner Erfahrung nach ist der HTML5 AppCache großartig, wenn man ihn einmal zum Laufen gebracht hat, aber extrem spröde. Wenn auch nur der kleinste Fehler auftritt, ignoriert der Browser die gesamte Datei und lädt ärgerlicherweise alles vom Server neu, anstatt den normalen Cache des Browsers zu verwenden.

Schlimmer noch, die Browser wird die Manifestdatei nicht neu geladen es sei denn, sein Textinhalt Änderungen. Sie könnten also Ihre Server-Header oder etwas anderes ändern, um das Problem zu beheben, aber solange der Inhalt von cache.manifest.php Änderungen wird der Browser sie blind ignorieren und die genau das, was es beim letzten Mal getan hat . Es könnte also defekt gewesen sein, dann haben Sie es repariert, aber die Browser ignorieren die Änderungen, weil der Textinhalt von cache.manifest.php hat sich nicht geändert. Dies scheint sogar immun gegen das Löschen des Browser-Caches zu sein, was es teilweise so verwirrend macht - der App-Cache nimmt das Zwischenspeichern sehr, sehr ernst.

Um dies zu umgehen, zählen Textänderungen in Kommentaren, daher sollte am Anfang ein Kommentar mit einem Versions- oder Zeitstempel oder dem Datum stehen (z. B. # Version 1.2 ) und ändern Sie das, wenn Sie möchten, dass der Browser "merkt".

Dann wird der Browser sie trotzdem nicht sofort verwenden! Die Art und Weise, wie der App-Cache funktioniert, ist das nächste Mal, wenn Sie die Seite laden, wird es tun genau das, was es beim letzten Mal getan hat und beginnt, im Hintergrund nach einer Aktualisierung zu suchen. Sie möchten also wahrscheinlich, dass die Konsole angezeigt wird, warten Sie auf etwas wie "Aktualisierung..." und dann auf "abgeschlossen", dann Klicken Sie auf Aktualisieren, damit der Browser endlich die neue Version verwendet. Na endlich!

Alles in allem kann es recht mühsam sein, es zum Laufen zu bringen. Wenn es jedoch einmal funktioniert, ist es nahezu kugelsicher: Sie können sich darauf verlassen, dass alles, was im Cachemanifest aufgeführt ist, nur heruntergeladen wird einmal , immer für alle Zeit, pro Benutzer, bis Sie den Textinhalt der Datei ändern.

Die Einhaltung von Browser-Standards ist heutzutage ziemlich gut, also ist meine beste Vermutung, dass es bei Ihnen tatsächlich funktioniert, aber Sie haben zuletzt Chrome überprüft, und das ist der einzige Browser, der die Manifestdatei korrekt zwischengespeichert hat. Während der Entwicklung war es vielleicht kaputt, aber Firefox und Opera klammern sich bis in den Tod an ihre alten Manifestdateien. Ich wette, Sie haben auch versucht, den Browser-Cache in Firefox und Opera zu löschen, was wahrscheinlich nichts gebracht hat - Sie müssen den Textinhalt der Datei ändern und zweimal neu laden, bevor Firefox und Opera endlich ihre kaputten Versionen der Manifestdatei aufgeben und diejenige verwenden, die funktioniert und die Sie wahrscheinlich vor Ewigkeiten hochgeladen haben.

9voto

Karen Zilles Punkte 7633

Von: http://appcache.offline.technology

In Firefox werden alle Ressourcen, die mit Cache-control: no-store bereitgestellt werden, nicht zwischengespeichert, selbst wenn sie explizit im Manifest enthalten sind.

Mein php ist standardmäßig auf Senden eingestellt:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Es genügt, dies hinzuzufügen:

header("Cache-Control: no-cache, must-revalidate");

in die php-Datei einfügen, damit sie mit dem Caching beginnt.

(Dies ähnelt der Antwort von Mychal Hackman, ist aber ein wenig spezifischer).

3voto

Yahia Punkte 68137

Für mich sieht Ihr Cachemanifest ein wenig "ungewöhnlich" aus... es könnte helfen, eine FALLBACK Ein weiterer Punkt ist, dass der Appcache mit dem "normalen Browser-Cache" interferieren könnte, d.h. wenn das Cache-Manifest geändert wird, muss sichergestellt werden, dass der Browser es neu lädt, was idealerweise durch eine Änderung des Namens erreicht wird (z.B. durch eine Versionsnummer, einen Zeitstempel... als Teil des Namens).

Sie können in Ihrer Seite mit dem Appcache über JS interagieren, was helfen könnte, das Problem, das Sie sehen, zu lokalisieren.

Ausführliche Informationen, einschließlich JS-Code und eine ausführliche Anleitung finden Sie unter

Wenn nötig, kommen Sie mit spezifischen Fragen zurück.

UPDATE

Gemäß den Kommentaren von OP diese zeigt eine schöne Implementierung der JS-API zum Überprüfen/Debuggen von Appcache, wie in den obigen Links beschrieben.

3voto

Mychal Hackman Punkte 319

Überprüfen Sie Ihren Cache in about:cache . Ich wette, Sie werden "data-size 0 bytes" für Ihre PHP-Datei(en) sehen.

Überprüfen Sie Ihre Caching-Header, ich fand in Firefox die Standardeinstellung war "no-cache" auf meine php-Dateien. Ich habe gerade hinzugefügt:

header("Pragma: public");
header("Cache-Control: public, max-age=6000");

zu meiner PHP-Datei hinzugefügt und den Offline-Cache neu geladen, und jetzt funktioniert es endlich.

こうしん

3voto

c69 Punkte 18025

Sie können den aktuellen Status des Anwendungscaches überprüfen, indem Sie window.applicationCache.status die einen numerischen Wert zurückgibt, der den folgenden Zuständen zugeordnet ist: 0 - uncached , 1 - idle , 2 - checking , 3 - downloading , 4 - updateready , 5 - obsolete.

Die Anwendungs-Cache-API weist einige erwähnenswerte Merkmale auf: window.applicationCache.update() : Dies löst den Download des Anwendungscaches aus, was fast dasselbe ist wie das Neuladen der Seite. Es wird lediglich geprüft, ob sich das Manifest geändert hat, und wenn ja, wird eine neue Version des gesamten Inhalts aus dem Cache heruntergeladen (unter Berücksichtigung aller Cache-Header). Beachten Sie, dass die Seite weiterhin den alten Cache verwendet, auch wenn dabei ein neuer Cache angelegt wird. Um die Seite dazu zu bringen, den neuen Cache zu verwenden, den Sie gerade heruntergeladen haben, müssen Sie die swapCache() Funktion.

window.applicationCache.swapCache() : Diese Funktion weist den Browser an, die neuen Cache-Daten zu verwenden, wenn sie verfügbar sind. Es ist wichtig zu beachten, dass die Anwendung auch bei Vorhandensein einer neuen Manifestdatei weiterhin den alten Cache (wie in der alten Manifestdatei angegeben) verwendet, bis swapCache() genannt wird. Sobald swapCache() aufgerufen wird, wird der Cache entsprechend den Angaben in der neuen Manifestdatei verwendet.

von: http://dev.opera.com/articles/view/offline-applications-html5-appcache/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X