How to properly invalidate an HTML5 Cache Manifest for online/offline web apps?

后端 未结 6 1247
不思量自难忘°
不思量自难忘° 2020-12-12 11:32

I\'m currently using a Cache Manifest (as described here). This effectively makes the necessary resources to run the application available when the user is offline.

6条回答
  •  春和景丽
    2020-12-12 11:51

    I think I've got this figured out: if there's an error in one's cache-manifest (say, a referenced file does not exist), then Firefox completely will stop processing anything applicationCache related. Meaning, it won't update anything in your cache, including your cached cache-manifest.

    To uncover that this was the issue, I borrowed some code from Mozilla and dropped this into a new (non-cached) HTML file in my application. The final message logged stated that there might be a problem in my cache-manifest, and sure enough there was (a missing file).

    
    // 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 }

    This was certainly helpful, but I should definitely request a feature from Mozilla that prints out malformed cache-manifests at least to the Error Console. It shouldn't require custom code to attach to these events to diagnose an issue as trivial as a renamed file.

提交回复
热议问题