我有一个使用HTML5应用程序缓存的脱机应用程序。在大多数情况下,它运作良好。我有几个客户端可以在多个设备(桌面,IOS,Android等)上访问该应用程序
最初的问题是,只要客户端的Web服务器重新启动以进行维护或任何其他目的,应用程序就会停止在某些设备上运行。他们刚收到运行时服务器错误。我们能够通过在服务器重新启动时在启动时实际更新缓存清单文件来解决此问题。我们从来没有弄清楚为什么重新启动服务器需要在某些设备上进行缓存更新,但它确实有效,所以我们将其放在后面进行研究。
现在我们有了一个新问题。某些Android设备在重新启动服务器时,不会更新缓存。如果在不重新启动服务器的情况下手动更新缓存清单,则缓存更新正常,但如果服务器重新启动Androids在“检查侦听器”和“下载侦听器”期间按预期工作,但它永远不会移动到“进度侦听器”。它不属于错误'错误监听器'它只是完成ondownloading功能然后停止。
这是我的代码: 以下所有代码都在外部js文件中,并且在aspx项目的母版页的头部调用registerCacheMethod。
var updatePhase = 'none';
var cacheCount = -1;
function handleCacheUpdated()
{
updatePhase = 'handleCacheUpdated()';
$('#modal_body_progress').html('Cache Updated Successfully');
alert('The application was updated. Login required.');
window.location.href = 'Login.aspx';
}
function handleOnDownloading()
{
updatePhase = 'Downloading';
$('#modal_body_Header').html('Cache Update');
$('#modal_body_text').html('Please do not close the browser or navigate away from this page while updating.');
$('#modal_body_progress').html('Updating...');
$('#modal_popup_container').css('display','inline');
cacheCount = 0;
return false;
}
function handleOnProgress()
{
updatePhase = 'Progress';
cacheCount++;
$('#modal_body_progress').html('Updating Entry: ' + cacheCount);
return false;
}
function handleCacheError(e)
{
$('#modal_body_progress').html('Error Loading Entry: (Count: ' + cacheCount + ', Phase: ' + updatePhase + ')');
return false;
}
function handleNoUpdate()
{
updatePhase = 'No Update';
}
function handleChecking()
{
updatePhase = 'Checking';
}
function handleCacheObsolete()
{
updatePhase = 'CacheObsolete';
}
function registerCacheMethods(method)
{
try
{
var cache = window.applicationCache;
if (cache == undefined)
{
alert('This browser does not support Application Cache');
return false;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* Between the poll and registering of the event you might miss the CACHEREADY event. This block will handle this.
*/
if (cache.status === applicationCache.UPDATEREADY)
{
handleCacheUpdated();
return false;
}
cache.addEventListener('updateready', handleCacheUpdated, false);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
cache.addEventListener('cached', handleCacheUpdated, false);
cache.addEventListener('noupdate', handleNoUpdate, false);
cache.addEventListener('downloading', handleOnDownloading, false);
cache.addEventListener('progress', handleOnProgress, false);
cache.addEventListener('error', handleCacheError, false);
cache.addEventListener('obsolete', handleCacheObsolete, false);
cache.addEventListener('checking', handleChecking, false);
}
catch (EX)
{
return false;
}
}
修改
我设法找到了更多相关信息。第一,我发现有问题的设备和浏览器。问题发生在三星Galaxy S3上运行的Android 4.3上。有了这些新信息,我发现有人已经问了类似的问题Here
答案 0 :(得分:0)
我相信您在这里有一个IIS(或您使用的Web服务器)配置问题。首先,当您忽略第一次重启问题时,您基本上会打开一扇新门来获取新错误,这可能就是为什么每种浏览器类型的行为都不同。我建议你关注重新启动它首先出现的问题。如果我没有错,请确保您的Web服务器或(客户端自己的Web服务器)必须配置为将* .appcache文件的expires头设置为立即过期。 &安培;你永远不应该手动访问缓存文件。对于apache这个指令有效。
ExpiresByType text/cache-manifest "access plus 0 seconds"