54 votes

Comment annuler un HTML5 Manifeste de Cache en ligne/hors-ligne les web-apps?

Je suis actuellement à l'aide d'un Manifeste de Cache (comme décrit ici). Cela rend effectivement les ressources nécessaires pour exécuter l'application disponible lorsque l'utilisateur est hors-ligne.

Malheureusement, il fonctionne un peu trop bien.

Après le manifeste de cache est chargé, Firefox 3.5+ caches de toutes les ressources explicitement mentionnés dans le manifeste de cache. Cependant, si un fichier sur le serveur est mis à jour et l'utilisateur tente de force de l'actualisation de la page en ligne (y compris le cache-manifeste de lui-même), Firefox sera absolument refuser de chercher quoi que ce soit. L'application reste complètement gelé, à ce dernier point, il a été mis en cache. Questions:

  1. Je veux Firefox de manière efficace uniquement s'appuyer sur les ressources mises en cache lors de la défaillance de la connexion réseau. J'ai essayé d'utiliser le bloc de SECOURS, mais en vain. Est-ce même possible?
  2. Si #1 n'est pas possible, est-il possible pour l'utilisateur de forcer le rafraîchissement de la page et de contournement de ce cache (ctrl + F5 ne le fait pas et ni ne effacement du cache du navigateur, scandaleusement) courte de la compensation de leurs données privées? Sinon, ne le cache-manifest mécanisme de soutien à l'expiration des en-têtes et de son comportement à l'égard de ce document n'importe où?

25voto

Justin Searls Points 3078

Je pense que j'ai compris: si il y a une erreur dans l'une de cache-manifest (par exemple, un fichier référencé n'existe pas), alors, Firefox va arrêter le traitement à tout applicationCache liés. Sens, il ne sera pas mise à jour quoi que ce soit dans votre cache, y compris votre cache cache-manifest.

Pour découvrir ce qu'était le problème, j'ai emprunté un peu de code à partir de Mozilla et a chuté dans une nouvelle (non mis en cache) fichier HTML dans mon application. Le message final connecté a déclaré qu'il pourrait y avoir un problème dans mon cache-manifest, et bien sûr, il y a (manquant de fichier).


// Convenience array of status values
var cacheStatusValues = [];
 cacheStatusValues[0] = 'uncached';
 cacheStatusValues[1] = 'idle';
 cacheStatusValues[2] = 'checking';
 cacheStatusValues[3] = 'downloading';
 cacheStatusValues[4] = 'updateready';
 cacheStatusValues[5] = 'obsolete';

 // Listeners for all possible events
 var cache = window.applicationCache;
 cache.addEventListener('cached', logEvent, false);
 cache.addEventListener('checking', logEvent, false);
 cache.addEventListener('downloading', logEvent, false);
 cache.addEventListener('error', logEvent, false);
 cache.addEventListener('noupdate', logEvent, false);
 cache.addEventListener('obsolete', logEvent, false);
 cache.addEventListener('progress', logEvent, false);
 cache.addEventListener('updateready', logEvent, false);

 // Log every event to the console
 function logEvent(e) {
     var online, status, type, message;
     online = (isOnline()) ? 'yes' : 'no';
     status = cacheStatusValues[cache.status];
     type = e.type;
     message = 'online: ' + online;
     message+= ', event: ' + type;
     message+= ', status: ' + status;
     if (type == 'error' && navigator.onLine) {
         message+= ' There was an unknown error, check your Cache Manifest.';
     }
     log('

C'est certes utile, mais j'devriez certainement demander une fonctionnalité de Mozilla, qui imprime mal formé cache-se manifeste au moins à la Console d'Erreur. Il ne devrait pas demander de code personnalisé à attacher à ces événements afin de diagnostiquer un problème d'aussi insignifiant qu'un fichier renommé.

15voto

Lukasz Points 9471

J'ai utilisé le code de HTML5 Rocks: mettre à Jour le cache:

window.addEventListener('load', function(e) {
  if (window.applicationCache) {
    window.applicationCache.addEventListener('updateready', function(e) {
        if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
          // Browser downloaded a new app cache.
          // Swap it in and reload the page to get the new hotness.
          window.applicationCache.swapCache();
          if (confirm('A new version of this site is available. Load it?')) {
            window.location.reload();
          }
        } else {
          // Manifest didn't changed. Nothing new to server.
        }
    }, false);
  }
}, false);

7voto

OlliM Points 1450

J'ai eu le même problème: une fois Firefox enregistré les fichiers hors connexion, il ne serait pas recharger jamais. Chrome a fonctionné comme prévu, il a vérifié le fichier de manifeste pour les changements et rechargé tout, si le fichier manifeste changé. Firefox n'ai même pas télécharger le fichier manifeste à partir du serveur, de sorte qu'il pourrait ne pas remarquer les changements.

Après enquête, j'ai découvert que Firefox a été mise en cache, le cache de fichier manifeste (à l'ancienne cache, pas le cache hors connexion). Réglage du cache en-tête du fichier manifeste pour Cache-Control: no-cache, private a résolu le problème.

7voto

GeoNomad Points 519

Avertissement: mon expérience avec les manifestes et cache tous les Safari et FF peut gérer certaines choses différemment.

  1. Vous avez tout à fait raison. S'il y a des fichiers figurant sur le manifeste qui ne peut pas être trouvé, pas de mise en cache se produire.

  2. Même si vous êtes en ligne, le navigateur ne vérifier que le fichier manifeste. En attendant que le fichier de manifeste, il va continuer à charger le site de la cache de cette façon, il n'a pas de délai de rendu, mais cela signifie que vous ne voyez pas les modifications sur la première charge.

  3. La prochaine fois que le site est chargé, si le manifeste changé sur le chargement précédent, les nouveaux fichiers seront chargés.

IL EST TOUJOURS NÉCESSAIRE DE RECHARGER deux fois pour voir les modifications. En fait, j'ai parfois eu à le recharger 3 fois pour voir la mise à jour. Aucune idée de pourquoi.

Lors du débogage, je générer mon fichier de manifeste à la volée avec php, donc il n'y a pas de chance de faire une faute de frappe dans le nom du fichier. J'ai aussi générer le numéro de version au hasard à chaque fois pour forcer une mise à jour, mais n'ont toujours hors connexion d'une webapp pour les tests.

Une fois terminé, le fichier php peut juste l'écho de l'enregistrées les données du manifeste avec une constante de numéro de version et le cache sera toujours utilisé.

Juste quelques choses que j'ai appris en jouant avec le manifeste et le cache récemment. Il fonctionne très bien, mais peut être source de confusion.

Il n'y a pas de date d'expiration. Pour uncache, vous devez modifier le fichier de manifeste de ne rien avoir en elle et de faire un rechargement. Sur Safari, l'effacement du cache de l'utilisateur n'efface tous les fichiers mis en cache.

3voto

keigoi Points 31

J'ai fait un add-on Firefox qui invalide le Manifeste de Cache et d'effacer le Stockage Local HTML5.

http://sites.google.com/site/keigoattic/home/webrelated#TOC-Firefox-HTML5-Offline-Cache-and-Loc

Vous pouvez aussi annuler le manifeste de cache en tapant le code ci-dessous dans la Console d'Erreur:

// invalidates the cache manifest
var mani = "http://.../mysite.manifest"; // manifest URL
Components.classes["@mozilla.org/network/application-cache-service;1"].getService(Components.interfaces.nsIApplicationCacheService).getActiveCache(mani).discard();

Ou, en tapant le code ci-dessous dans la barre d'adresse manuellement enforece le cache de mise à jour:

javascript:applicationCache.update()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X