Pergunta

Atualmente estou usando um manifesto de cache (como descrito aqui ). Isso efetivamente faz com que os recursos necessários para executar o aplicativo disponível quando o usuário estiver offline.

Infelizmente, ele funciona um pouco bem demais.

Depois do cache manifesto é carregado, Firefox 3.5+ armazena em cache todos os recursos explicitamente referenciados no cache manifesto. No entanto, se um arquivo no servidor é atualizado e o usuário tenta força-atualizar a página, enquanto on-line (incluindo o cache-manifesto em si), o Firefox irá se recusam a buscar qualquer coisa. Os restos de aplicações completamente congelado no último ponto em que foi armazenada em cache. Perguntas:

  1. Eu quero Firefox confiar efetivamente apenas nos recursos em cache quando a conexão de rede falhar. Eu tentei usar o bloco FALLBACK, mas sem sucesso. Isto é mesmo possível?
  2. Se nº 1 não é possível, é possível para o usuário a força de atualizar uma página e avança este cache (ctrl-F5 não fazê-lo e também não limpar o cache do navegador, chocante) curta de limpar sua privada dados? Alternativamente, faz os cabeçalhos de expiração de apoio mecanismo de cache-manifesto e é o seu comportamento em relação a isso em qualquer lugar documentado?
Foi útil?

Solução

Eu acho que eu tenho isso descobri: se há um erro em sua cache-manifesto (digamos, um arquivo referenciado não existe), então Firefox completamente irá parar de processar nada ApplicationCache relacionados. Significado não, ele irá atualizar qualquer coisa em seu cache, incluindo o seu cache cache-manifesto.

para descobrir que este era o problema, I emprestado algum código da Mozilla e caiu isso em um arquivo (não armazenada em cache) HTML novo em meu aplicativo. A mensagem final logado afirmou que pode haver um problema no meu cache-manifesto, e com certeza houve (um arquivo ausente).


// 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('
'+message); } function log(s) { alert(s); } function isOnline() { return navigator.onLine; } if (!$('html').attr('manifest')) { log('No Cache Manifest listed on the tag.') } // Swap in newly download files when update is ready cache.addEventListener('updateready', function(e){ // Don't perform "swap" if this is the first cache if (cacheStatusValues[cache.status] != 'idle') { cache.swapCache(); log('Swapped/updated the Cache Manifest.'); } } , false); // These two functions check for updates to the manifest file function checkForUpdates(){ cache.update(); } function autoCheckForUpdates(){ setInterval(function(){cache.update()}, 10000); } return { isOnline: isOnline, checkForUpdates: checkForUpdates, autoCheckForUpdates: autoCheckForUpdates }

Este foi certamente útil, mas eu definitivamente deve solicitar um recurso do Mozilla que imprime cache-se manifesta malformados, pelo menos, ao erro Console. Ele não deve exigir um código personalizado para anexar a esses eventos para diagnosticar um problema tão trivial como um arquivo renomeado.

Outras dicas

Eu usei código de HTML5 Rocks: atualizar o 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);

Disclaimer:. Minha experiência com manifestos e cache é tudo Safari e FF pode lidar com algumas coisas de forma diferente

  1. Você tem toda a razão. Se houver quaisquer arquivos listados no manifesto que não podem ser encontrados, nenhum cache irá ocorrer.

  2. Mesmo se você estiver on-line, o navegador irá verificar apenas o arquivo de manifesto. Enquanto espera para o arquivo de manifesto, que vai continuar a carregar o site a partir do cache - de que maneira ele não atrasar tornando - mas isso significa que você não vê quaisquer alterações na primeira carga

  3. A próxima vez que o site é carregado, se o manifesto mudou da carga anterior, os novos arquivos serão carregados.

É sempre necessário para recarregar duas vezes para ver as alterações. Na verdade, eu às vezes tinha de recarga 3 vezes para ver a atualização. Não faço ideia porquê.

Quando a depuração, eu gerar meu arquivo de manifesto na mosca com php, por isso não há chance de um erro de digitação em um nome de arquivo. Eu também gerar o número da versão aleatoriamente cada vez para forçar uma atualização, mas ainda tem um webapp off-line para testar.

Uma vez completo, o arquivo php pode apenas ecoar os dados de manifesto salvas com um número de versão constante e o cache será sempre utilizado.

Apenas algumas coisas que eu aprendi enquanto brincava com manifesto e de cache recentemente. Ele funciona muito bem, mas pode ser confuso.

Não há nenhuma validade. Para uncache, você tem que mudar o arquivo de manifesto não ter nada nele e fazer uma recarga. No Safari, limpar o cache usuário faz limpar todos os arquivos em cache.

Eu tive o mesmo problema: uma vez que o Firefox salva os arquivos off-line, não seria recarregá-las sempre. Chrome funcionou como esperado, ele verificou o arquivo de manifesto para mudanças e tudo recarregado se o arquivo de manifesto alterado. Firefox nem sequer baixar o arquivo de manifesto a partir do servidor, por isso não poderia alterações Aviso.

Após investigação, eu descobri que o Firefox foi cache o arquivo de cache manifesto (cache moda antiga, não o cache offline). Definir o cache cabeçalho do arquivo de manifesto para Cache-Control: no-cache, private resolveu o problema.

Eu fiz um Firefox add-on que invalida o manifesto de cache e limpa HTML5 armazenamento local.

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

Você também pode invalidar o cache manifesto digitando o código abaixo na consola de erro:

// 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, digitando o código abaixo na barra de endereços vai enforece manualmente o cache a ser atualizado:

javascript:applicationCache.update()

Hmm, eu apenas chamado update () na cache, depois de fazer uma mudança de edição para o arquivo de manifesto, e recebeu a sequência completa de verificação / download / pronto, fez uma recarga, e uma mudança de texto que eu tinha feito em um dos meus arquivos js, que aparece na página inicial do meu aplicativo, prontamente apareceu.

Parece que eu só precisa de uma recarga.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top