Myślę, że mam to zorientowali się: jeśli istnieje błąd w jednym manifestu pamięci podręcznej (np. Plik odniesienia nie istnieje), a następnie Firefox całkowicie przestanie przetwarzać coś związanego z appCache. Oznacza to, że nie zaktualizuje niczego w pamięci podręcznej, w tym w buforze podręcznym manifestu.
Aby odkryć, że to był problem, I borrowed some code from Mozilla i upuściłem to do nowego (niezbuforowanego) pliku HTML w mojej aplikacji. Ostatnia zarejestrowana wiadomość oświadczyła, że może występować problem w moim pliku manifestu pamięci podręcznej i na pewno istnieje (brakujący plik).
// 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
}
To był na pewno pomocne, ale należy zdecydowanie zażądać funkcji z Mozilli, który drukuje się zniekształcone Cache-manifesty przynajmniej do konsoli błędów. Nie należy wymagać niestandardowego kodu dołączanego do tych zdarzeń, aby zdiagnozować problem tak trywialny jak plik o zmienionej nazwie.
Widziałem ten przykładowy problem występujący z przerwami. Zwykle aktualizowanie pliku w manifeście, a następnie aktualizowanie numeru wersji komentarza w manifeście powoduje przeładowanie zaktualizowanego pliku, ale czasami Firefox blokuje się i odmawia przeładowania nowego zasobu, mimo że nic nie jest nie tak z manifestem. Jedynym sposobem rozwiązania problemu jest wyczyszczenie pamięci podręcznej trybu offline, ale nie jest to dopuszczalne w przypadku aktualizacji wdrażania. – Michael