Ankündigung

Einklappen
Keine Ankündigung bisher.

App Cache unter iOS

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] App Cache unter iOS

    Moin zusammen,

    bei iOS (iPad, iPhone) kommt es bei der Installation der Visu als WebApp (Icon auf dem Homescreen) immer wieder mal zu Cache Problemen.
    Diese äußern sich so, dass Änderungen am Code der Visu (html, js, usw.) auf dem iPad nicht angezeigt werden.
    Grund hierfür ist, dass der Cache in iOS nach Änderungen nicht aktualisiert wird.
    Um dies zu umgehen, ist es notwendig iOS mitzuteilen, dass sich Dateien geändert haben. Eine Möglichkeit hierfür ist eine cache Manifest Datei anzulegen. Diese enthält eine Versionsnummer/Hash. Sobald sich diese Datei ändert wird ein Neuladen des Cache in iOS erzwungen.

    Der Trick dabei ist, dass die Datei auch über einen php Aufruf erzeugt werden kann. Mit diese php Datei können Hash-Werte aus allen Datei, die gecacht werden, berechnet werden.

    Die cache.manifest Datei muss im html-Tag der Seite mit aufgerufen werden.

    Hierfür ist die Datei root.html anzupassen.
    HTML-Code:
    <!DOCTYPE html>
    
    <html manifest="pages/{{ config_pages }}/cache.manifest.php" type="text/cache-manifest">
    
    <head>
    cache.manifest.php Datei erstellen
    PHP-Code:
    <?php
    /**
     * Iterates through every directory and generate a manifest file.
     * If any file change occurs, the manifest changes and the browser triggers an
     * application refresh.
     */

    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');

    $hashes "";

    function 
    printFiles($path '.'$subDir ''){
            global 
    $hashes;

            
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
            foreach(
    $objects as $name => $file) {
                    if (
    $file->isFile() && $file->getFilename() !== 'cache.manifest.php') {
                            echo 
    substr($name2) . "\n";
                            
    $hashes .= md5_file($file);
                    }
            }
    }
    ?>
    CACHE MANIFEST
    <?php
    printFiles
    ();
    // version hash changes automatically when files are modified
    echo "#VersionHash: " md5($hashes) . "\n";
    ?>

    NETWORK:
    *
    Optimierungspotential:
    Aktuell arbeite ich mit einer angepassten root.html und habe die cache.manifest Datei in meinem Pages Ordner.
    Wenn ich es richtig verstehe, wird der Cache daher auch nur erneuert, wenn sich Dateien in meinem Pages Ordner ändern. Änderungen am JS des SV-Core bekommt mein Manifest nicht mit.
    Andererseits werden IMHO auch nur Dateien gecacht, die in der Manifest Datei explizit erwähnt sind. Dann würde das aber bedeuten, dass ich aktuell beim Neuladen einer Seite viel zu viel lade, da die Core Dateien bei mir nicht gecacht werden.

    Gruß, Sebastian
    Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
    Ruhri? -> Komm zum Stammtisch

    #2
    Ist das auch für Android relevant?

    Kommentar


      #3
      Zitat von Eugenius Beitrag anzeigen
      Ist das auch für Android relevant?
      Solange kein Manifest vorhanden ist, wird meines Wissens unter Android das Caching korrekt gemacht, es gibt also keine Probleme.
      Wenn eines angegeben ist, wirkt das auch für Android und sogar für die meisten Desktop Browser.

      Kommentar


        #4
        Bainit mich verwirrt das NETWORK: * etwas. Dieses bewirkt doch, dass gar nichts gecached wird.

        Oder verstehe ich folgendes von https://developer.mozilla.org/de/doc...K_and_FALLBACK falsch:
        NETWORK:
        Files listed under the NETWORK: section header in the cache manifest file are white-listed resources that require a connection to the server. All requests to such resources bypass the cache, even if the user is offline. Wildcards may be used.
        Oder anders gefragt: Wenn ich den App Cache zur Offlinenutzung ganz umgehen möchte und nur den normalen HTTP-Cache nutzen, kann ich dann nicht einfach NETWORK: * eintragen?
        Zumindest bei deaktiviertem Page Cache in der smartVISU würde das meiner Meinung nach Sinn machen.

        Kommentar


          #5
          Ich konnte mir die Frage unterdessen selbst beantworten: Das eigentliche HTML-Dokument (also index.php) landet trotzdem im App Cache.


          Dein Beispiel oben hat eben leider mindestens drei Schwachpunkte:

          1. Jede Datei in den aktuellen Pages wird heruntergeladen und gecached. Auch solche, die nur als Template dienen und gar nie direkt aufgerufen werden müssten. Wenn jemand nun noch irgend eine spezielle Datei baut, welche direkt beim Laden etwas bewirkt, wird diese ebenfalls unbewusst ausgeführt.

          2. Die smartVISU eigenen Ressourcen werden nicht gecached. Dabei wären genau diese CSS und JavaScripts sinnvoll.

          3. Umgekehrt werden aber auch Änderungen an smartVISU Dateien nicht erkannt. Ändert z.B. durch ein Update die pages/base/root.html müssten eigentlich alle darauf basierenden Page-Dateien neue geladen werden, was aber nicht geschieht.


          Deshalb wäre es mir am liebsten, den App Cache ganz zu deaktivieren und nur auf den HTTP Cache zu setzen. Wenn die Datei direkt im Browser geöffnet wird, ist dies ja bisher auch so. Es betrifft ja nur Homescreen-Verknüpfungen unter iOS, die anscheinend auch ohne Manifest automatisch im App Cache landen.


          Kommentar


            #6
            Moin Sefan,
            erlich gesagt habe ich mir das auch nur aus dem Internet zusammen kopiert.
            Wirklich verstanden habe ich das nur teilweise. Für keine Zwecke (u.a. Angepasstes js in meinem Pages Ordner) tat es. Das hab ich dann nicht weiter hinterfragt.

            zu 3: ja, die Datei im eigenen Pages Ordner liegen zu haben hat Nachteile, wenn der Core aktualisiert wird.
            Momentan liegt auch die Root.html in meinem eigenen Pages Ordner. Sinnvoller wäre natürlich, die Pages/base/root.html direkt anzupassen und die Cache.manifest.php ebenfalls unter base/ liegen zu habe. Dafür hätte ich dann aber die cache.manifest Datei anpassen müssen, das sie die relevanten Verzeichnisse durchgeht. Da war ich dann, mal wieder, mit meinem Latein am Ende, und habe es gelassen.

            Ja, das wäre auch eine gute Lösung. Wüsste aber nicht, das man das so einrichten kann.
            Das alte iPad an der Wand startet die Visu eh selten neu, und an den anderen Geräten geht es im internen Netz auch ohne Caching schnell genug, Einzig über VPN von außen könnte Caching von Vorteil sein.

            Gruß, Sebastian
            Baustelle 2.0 (Detailprogrammierung und Restarbeiten)
            Ruhri? -> Komm zum Stammtisch

            Kommentar

            Lädt...
            X