2012-11-27 6 views
4

Je travaille sur une petite WebApp mobile avec un mode hors-ligne. Est-il possible d'empêcher la mise à jour automatique si le fichier manifeste a été modifié? Si l'utilisateur a une mauvaise connexion Internet, il ne devrait pas être obligé de télécharger tous les fichiers mais devrait recevoir un petit message afin qu'il puisse mettre à jour les fichiers plus tard.HTML 5 Cache: window.applicationCache.abort(); ne fonctionne pas

J'ai essayé

window.addEventListener('load', function(e) {  
    window.applicationCache.addEventListener('ondownloading', function(e) { 
     window.applicationCache.abort(); 
    }, false); 
}, false); 

Mais il ne fonctionne pas. Ni dans Safari 6.0.2 ni dans Chrome Canary.

L'application ne doit mettre à jour les fichiers lorsque l'utilisateur clique sur ma « mise à jour » manuellement -Button avec ce code:

var appCache = window.applicationCache; 
appCache.update(); 

if (appCache.status == window.applicationCache.UPDATEREADY) { 
    appCache.swapCache(); // The fetch was successful, swap in the new cache. 
} 

Répondre

1

Vous n'avez pas besoin d'envelopper votre downloadingaddEventListener appel à un événement windowload, l'objet applicationCache est là depuis le début.

Vous écoutez un événement ondownloading, mais il n'y a pas d'événement nommé, vous n'avez pas besoin du on. Cependant, vous souhaiterez probablement intercepter le processus de mise à jour un peu plus tôt, via l'événement checking. Vous n'avez pas besoin d'appeler le abort non plus, car l'événement checking est annulable.

var blockUpdates = true; 

window.applicationCache.addEventListener('updating', function(event) { 
    if (blockUpdates) { 
     event.preventDefault(); 
    } 
}, false); 

function updateButtonPressed() { 
    blockUpdates = false; 
    window.applicationCache.update(); 
} 

window.applicationCache.addEventListener('updateready', function() { 
    // but what do we do here? 
}, false); 

Mais que devez-vous faire lorsque vous avez une mise à jour? swapCache utilisera le cache mis à jour, mais seulement pour les nouvelles demandes, il y a de fortes chances que vous ayez déjà les anciens fichiers sur la page. Le moyen le plus simple de remplacer les anciens éléments par new est de recharger la page. Vous pouvez le faire automatiquement, mais cela peut perturber l'utilisateur, mieux lui dire qu'une mise à jour est prête et fournir un bouton pour recharger la page.

+0

Ce qui précède est conforme aux spécifications, je ne l'ai pas testé dans un navigateur. –

2

La réponse de Jaffa ne fonctionne pas. (au moins en chrome). L'application appcache se met automatiquement à jour quoi qu'il arrive, donc la seule façon de contrôler quand le client reçoit des mises à jour du serveur est de gérer chaque manifeste de cache par client (par navigateur).

Le navigateur devra créer un GUID BrowserID et le stocker dans localStorage. Lorsqu'il demande le manifeste de cache, il doit inclure l'identificateur de navigateur dans l'URL. Lorsque le serveur envoie le manifeste de cache, il le met en cache côté serveur. Chaque demande suivante pour le manifeste renvoie la version mise en cache.

Lorsque l'utilisateur appuie sur le bouton Sync, le navigateur envoie une requête Cache Bust incluant l'ID du navigateur. Cela provoque la demande Cache Cache suivante avec ce BrowserID pour renvoyer le manifeste mis à jour, pas la version mise en cache.

Questions connexes