Moin,
da ich bei Verwendung der HomeScreen Funktion auf dem iPad ständig in den Cache gelaufen bin (PageCache ist deaktiviert), hatte ich in einem anderen Beitrag schon mal eine "appcache.manifest" Datei erwähnt die ich bei Changes manuell modifiziert hatte, wodurch der HomeScreen App dann mitgeteilt wurde das Dateien zu refreshen wären.
Nachdem mir das jetzt aber etwas auf die Nerven ging für jede kleine Änderung die Datei anzupassen habe ich etwas recherchiert und als Lösung gefunden, dass es möglich ist PHP-Code in der Manifest-Datei zu verwenden, bzw. eine PHP-Datei als Manifest zu nutzen.
Das Ergebnis sieht wie folgt aus:
Schöner finde ich es mit foreach, da ich aktuell aber in einer Ubuntu VM über Parallels entwickle und hier wohl ein PHP-Bug beim DirectoryIterator besteht verwende ich stattdessen "while".
Wer es ausprobieren mag kann die "While"-Schleife durch "foreach" ersetzen:
Eingebunden habe ich die Datei dann im "HTML"-Tag meiner "base.html"
Und damit die neue Version auch automatisch geladen wird habe ich noch ein Script in meine "visu.js" gepackt:
Schön wäre vermutlich noch ein Hinweis für den Benutzer, dass es ein Update gibt und die Seite neu geladen wird, aber mir passt das während der Entwicklung ganz gut wenn ich nicht jedes mal "Ok" drücken muss.
Vielleicht hilft das dem ein oder anderen, oder vll. benutze ich auch nur irgendwas falsch, das der AppCache mir ständig verweigert meine Anpassungen an der Visu zu sehen.... ;-)
Gruß,
Lars
da ich bei Verwendung der HomeScreen Funktion auf dem iPad ständig in den Cache gelaufen bin (PageCache ist deaktiviert), hatte ich in einem anderen Beitrag schon mal eine "appcache.manifest" Datei erwähnt die ich bei Changes manuell modifiziert hatte, wodurch der HomeScreen App dann mitgeteilt wurde das Dateien zu refreshen wären.
Nachdem mir das jetzt aber etwas auf die Nerven ging für jede kleine Änderung die Datei anzupassen habe ich etwas recherchiert und als Lösung gefunden, dass es möglich ist PHP-Code in der Manifest-Datei zu verwenden, bzw. eine PHP-Datei als Manifest zu nutzen.
Das Ergebnis sieht wie folgt aus:
PHP-Code:
<?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');
$hashes = "";
function printFiles($path = '.', $subDir = ''){
global $hashes;
$dir = new RecursiveDirectoryIterator($path);
$files = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
while ($files->valid()) {
$file = $files->current();
$isDot = substr($file->getFilename(), 0, 1) === ".";
if ($isDot) {
$files->next();
continue;
}
if (
$file->isFile()
&& $file->getFilename() !== 'cache.manifest.php'
) {
echo $subDir . $file->getFilename() . "\n";
$hashes .= md5_file($file);
}
if ($file->isDir()) {
printFiles($path . '/' . $file->getFilename(), $file->getFilename() . DIRECTORY_SEPARATOR);
}
$files->next();
}
}
?>
CACHE MANIFEST
<?php
printFiles();
// version hash changes automatically when files are modified
echo "#VersionHash: " . md5($hashes) . "\n";
?>
NETWORK:
*
FALLBACK:
Schöner finde ich es mit foreach, da ich aktuell aber in einer Ubuntu VM über Parallels entwickle und hier wohl ein PHP-Bug beim DirectoryIterator besteht verwende ich stattdessen "while".
Wer es ausprobieren mag kann die "While"-Schleife durch "foreach" ersetzen:
PHP-Code:
foreach($files as $file) {
$isDot = substr($file->getFilename(), 0, 1) === ".";
if ($isDot) {
continue;
}
if (
$file->isFile()
&& $file->getFilename() !== 'cache.manifest.php'
) {
echo $subDir . $file->getFilename() . "\n";
$hashes .= md5_file($file);
}
if ($file->isDir()) {
printFiles($path . '/' . $file->getFilename(), $file->getFilename() . DIRECTORY_SEPARATOR);
}
}
Eingebunden habe ich die Datei dann im "HTML"-Tag meiner "base.html"
HTML-Code:
<html manifest="pages/{{ config_pages }}/cache.manifest.php">
Schön wäre vermutlich noch ein Hinweis für den Benutzer, dass es ein Update gibt und die Seite neu geladen wird, aber mir passt das während der Entwicklung ganz gut wenn ich nicht jedes mal "Ok" drücken muss.
Code:
function updateSite(event) { window.applicationCache.swapCache(); window.location.reload(); } window.applicationCache.addEventListener('updateready', updateSite, false);
Vielleicht hilft das dem ein oder anderen, oder vll. benutze ich auch nur irgendwas falsch, das der AppCache mir ständig verweigert meine Anpassungen an der Visu zu sehen.... ;-)
Gruß,
Lars
Kommentar