我有一个使用 HTML5 应用程序缓存的离线应用程序。在大多数情况下,它运行良好。我有一些客户端在多个设备(桌面、IOS、Android 等)上访问该应用程序
最初的问题是,每当客户端的 Web 服务器因维护或任何其他目的而重新启动时,应用程序就会停止在某些设备上运行。他们刚刚收到运行时服务器错误。我们能够通过在服务器重新启动时在启动时务实地更新缓存 list 文件来解决此问题。我们从未弄清楚为什么重新启动服务器需要在某些设备上更新缓存,但它确实有效,因此我们将其搁置以供稍后研究。
现在我们有一个新问题。有些Android设备当服务器重新启动时,不会更新缓存。如果手动更新缓存 list 而不重新启动服务器,则缓存更新正常,但如果服务器重新启动,Android 在“检查监听器”和“下载监听器”期间按预期工作,但它永远不会移动到“进度监听器”。它不会陷入错误“错误监听器”,它只是完成 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;
}
}
编辑
我设法找到了更多关于此的信息。第一,我找到了有问题的设备和浏览器。该问题发生在运行 Android 4.3 的 Samsung Galaxy S3 上。有了这个新信息,我发现有人已经问过类似的问题Here
最佳答案
我相信您在这里遇到了 IIS(或您使用的 Web 服务器)配置问题。首先,当您忽略第一次重新启动问题时,您基本上打开了一扇新的门来获取新的错误,可能这就是为什么每种浏览器类型的行为不同的原因。我建议您首先关注重新启动问题。如果我没记错的话,请确保您的 Web 服务器或(客户端自己的 Web 服务器)必须配置为设置 *.appcache 文件的过期 header 以立即过期。 &您永远不应该手动访问缓存文件。对于 apache 这个指令有效。
ExpiresByType text/cache-manifest“访问加 0 秒”
关于javascript - 缓存 list 更新因 'ondownloading' 事件而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994369/