我正在使用离线缓存来使我的HTML5应用在离线模式下可用。这适用于所有桌面浏览器(Firefox,Chrome,Safari - 我不关心IE)以及Android Chrome,iOS Chrome甚至iPhone上的Safari。但是在iPad safari上它不起作用。
使用现在标准的cache debug routine by Jonathan Stark并通过我的Mac上的Safari进行调试,我在控制台中看到以下内容:
[Log] online: yes, event: checking, status: downloading (cachedebug.js, line 30)
[Log] online: yes, event: downloading, status: downloading (cachedebug.js, line 30)
[Log] online: yes, event: progress, status: downloading (cachedebug.js, line 30, x159)
[Log] online: yes, event: progress, status: updateready (cachedebug.js, line 30)
[Log] online: yes, event: updateready, status: updateready (cachedebug.js, line 30)
[Log] swap cache has been called (cachedebug.js, line 37)
[Error] InvalidStateError: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.
swapCache (main.js:407)
(anonymous function) (main.js:407)
注意最后的错误。我确实赞扬了乔纳森的代码中的swapCache
行。这种情况几乎总是发生在iPad Safari上 - 但不会出现在任何其他设备/浏览器上。我确实尝试在Safari设置中删除我网站的所有数据 - 无济于事。
因此,应用程序永远不会完全缓存,因此我无法在离线时运行它。
对于记录,我的主文件以此开头:
<!DOCTYPE html>
<html lang="en" manifest="cache.manifest">
main.js中的代码如下所示:
403 function setupAppCacheListeners() {
404 var appCache = window.applicationCache;
405 appCache.addEventListener("downloading", function() { toast("Downloading an update - please do not close the application."); });
406 appCache.addEventListener("updateready", function() {
407 appCache.swapCache();
408 toast("Updates downloaded successfully - please restart the application.", 0);
409 $('#button-refresh').removeClass('hidden');
410 });
411 appCache.addEventListener("cached", function() { toast("Download for offline use completed."); });
up to date."); });
412 appCache.addEventListener("error", function() {
413 if(navigator.onLine) {
414 toast("An error occurred updating the app - please try restarting.");
415 }
416 });
417 }
有趣的是,这个应用程序是我几年前写的另一个应用程序的分支,它完全正常,没有这样的问题。
对此的任何帮助都将非常感激。