Filipe hat die Verknuepfungen dreimal neu angelegt und sah trotzdem das alte Symbol. Die Ursache lag nicht an den neuen Dateien - die werden nachweislich korrekt ausgeliefert (36 von 36 live byteweise geprueft), sondern an vier Altlasten: /assets/img/favicon.png 256x256 /assets/img/apple-touch-icon.png 180x180 /assets/img/icon-192.png 192x192 /assets/img/icon-512.png 512x512 Die stammen aus der Zeit vor dem Umbau auf app-symbole/ und werden von KEINER Seite mehr verlinkt - geprueft mit einer Suche ueber alle html, js, json und webmanifest: nur noch sw.js und main.js nennen sie. Aber Chrome hat sich das Favicon dieser Domain gemerkt, als favicon.png noch verlinkt war, und gibt es nicht mehr her: Beim Anlegen einer Verknuepfung nimmt Windows dieses alte Bild, egal was im HTML steht. Auf Filipes Bildschirm trugen deshalb ZWEI verschiedene Verknuepfungen dasselbe Symbol - das war der entscheidende Hinweis, denn zwei Apps mit verschiedenen Manifesten koennen unmoeglich dasselbe Symbol haben. Statt zu hoffen, dass ein Zwischenspeicher irgendwann aufgibt, tragen die alten Adressen jetzt einfach dasselbe Bild wie die neuen. Damit ist es egal, welche ein Programm nimmt. Dazu im Service Worker: CACHE_NAME auf v2 hochgezaehlt - activate() loescht dadurch den alten Zwischenspeicher samt altem Symbol. Und SHELL_ASSETS zeigt nicht mehr auf die verwaisten icon-192/-512, sondern auf die Adressen aus dem Manifest. Co-Authored-By: Claude Opus 5 <[email protected]>
80 lines
2.9 KiB
JavaScript
80 lines
2.9 KiB
JavaScript
/* =====================================================================
|
|
sw.js — minimaler Service Worker für DOGFATHER UNIVERSE
|
|
Zweck: NICHT primär Offline-Funktionalität, sondern die technische
|
|
Voraussetzung, damit Chrome/Edge auf dem Desktop den "App installieren"-
|
|
Prompt zuverlässig anzeigt (Chrome verlangt dafür einen registrierten
|
|
Service Worker mit fetch()-Handler, siehe developer.chrome.com/blog/
|
|
update-install-criteria, Stand 2026). Nebenbei cached er die wichtigsten
|
|
Shell-Dateien, damit die Seite bei Verbindungsabbruch nicht komplett
|
|
leer bleibt — bewusst simpel gehalten (kein Offline-Vollausbau).
|
|
===================================================================== */
|
|
|
|
/* Die Zahl am Ende MUSS hochgezaehlt werden, wenn sich hier etwas aendert:
|
|
activate() loescht jeden Zwischenspeicher, dessen Name nicht genau so
|
|
heisst. Ohne das Hochzaehlen behaelt ein Geraet den alten Inhalt
|
|
beliebig lange — am 06.09.2026 war genau das der Fall, ein Geraet hielt
|
|
noch das alte Symbol fest. */
|
|
const CACHE_NAME = "dogfather-universe-shell-v2";
|
|
const SHELL_ASSETS = [
|
|
"/",
|
|
"/index.html",
|
|
"/assets/css/main.css",
|
|
"/assets/css/theme-dogfather.css",
|
|
"/assets/css/theme-hasidog.css",
|
|
"/assets/css/theme-spicymedia.css",
|
|
"/assets/js/main.js",
|
|
/* Symbole: die Adressen, auf die das Manifest zeigt. Bis 06.09.2026
|
|
standen hier /assets/img/icon-192.png und -512.png — die benutzt
|
|
seit dem Umbau auf app-symbole/ keine Seite mehr. */
|
|
"/assets/img/favicon.png",
|
|
"/assets/img/app-symbole/universe-192.png",
|
|
"/assets/img/app-symbole/universe-512.png",
|
|
];
|
|
|
|
self.addEventListener("install", (event) => {
|
|
event.waitUntil(
|
|
caches
|
|
.open(CACHE_NAME)
|
|
.then((cache) => cache.addAll(SHELL_ASSETS))
|
|
.catch(() => {
|
|
/* Einzelne Assets könnten fehlen (z.B. beim allerersten Deploy) —
|
|
soll die Installation des Service Workers nicht blockieren. */
|
|
})
|
|
);
|
|
self.skipWaiting();
|
|
});
|
|
|
|
self.addEventListener("activate", (event) => {
|
|
event.waitUntil(
|
|
caches
|
|
.keys()
|
|
.then((keys) =>
|
|
Promise.all(
|
|
keys
|
|
.filter((key) => key !== CACHE_NAME)
|
|
.map((key) => caches.delete(key))
|
|
)
|
|
)
|
|
.then(() => self.clients.claim())
|
|
);
|
|
});
|
|
|
|
/* Network-first mit Cache-Fallback: liefert immer die aktuellste Version,
|
|
greift nur bei echtem Verbindungsausfall auf den Cache zurück — damit
|
|
Änderungen an der Seite nicht durch veraltete Caches verdeckt werden. */
|
|
self.addEventListener("fetch", (event) => {
|
|
if (event.request.method !== "GET") return;
|
|
const url = new URL(event.request.url);
|
|
if (url.origin !== self.location.origin) return;
|
|
|
|
event.respondWith(
|
|
fetch(event.request)
|
|
.then((response) => {
|
|
const copy = response.clone();
|
|
caches.open(CACHE_NAME).then((cache) => cache.put(event.request, copy));
|
|
return response;
|
|
})
|
|
.catch(() => caches.match(event.request))
|
|
);
|
|
});
|