iPhone应用程序缓存和XMLHttpRequest

时间:2010-01-21 21:08:30

标签: iphone xmlhttprequest

我有一个WebApp,我一直试图让它脱机工作。 WebApp太大,甚至缩小,只是简单地使用应用程序缓存(事情下载但我最终得到一个window.applicationCache错误)。我正在尝试使用XMLHttpRequest来获取更大的脚本和主要的html,并将它们保存在localStorage中,并在应用程序缓存中保留一个小的加载器脚本。我看到的问题是XMLHttpRequest在本地提供加载器脚本时返回网络错误。下载缓存时,不会返回任何错误,并且工作正常。当我关闭应用程序缓存时,加载器工作正常,但当然我需要网络来获取加载器。

我尝试setRequestHeader("Cache-Control", "no-cache"),但这没有帮助。

有人有线索吗?

3 个答案:

答案 0 :(得分:2)

您的联盟中的网络部分是什么样的?

我发现如果我不允许使用通配符网络流量,则不会加载XMLHttpRequest。所以改成它:

网络: *

为我们做了诀窍。

答案 1 :(得分:1)

我想我找到了解决方案。它可能适用于其他人。

我将加载器分成两个单独的HTML文件:一个使用XMLHttpRequest获取所有必需的文件并将它们放在localStorage(加载器)中,另一个只是从localStorage读取文件并将它们写入文档(引导程序) )使用适当的包装(例如)。引导程序有一个清单文件,用于将其保留在应用程序缓存中。装载机没有。用户首先调用引导程序。如果引导程序找到已经存在于localStorage中的文件,它就会发生这种情况。否则,它使用location.replace()来调用加载器。加载器使用XMLHttpRequest从服务器加载文件并将它们放在localStorage中,然后使用location.replace()重新调用引导程序。这似乎不会导致网络错误。

为了脱机运行,用户必须在iPhone Safari浏览器中调用引导程序(它会调用加载程序,它会重新启动引导程序),从而启动WebApp。在Safari中,用户必须将WebApp(引导链接)添加到其主屏幕(使用底部的“+”按钮)。离线时,用户可以从主屏幕图标进入应用程序。重新渲染需要几秒钟,但之后它完全正常运行。在线时也是同样的延迟。从iPhone Safari浏览器调用链接将无法脱机工作,但它可以在线工作。

引导程序监视应用程序缓存的“updateready”事件,以便在联机时,当iPhone检测到引导程序清单文件发生更改并下载新引导程序时,它将交换新缓存(window.applicationCache.swapCache())并再次使用location.replace()调用加载程序。我还添加了一个alert()来让用户知道正在发生什么样的事情。因此,更改清单文件(我的意思是使一些字节不同,而不仅仅是调整修改时间)将导致客户端在线时获取新文件。

有趣的是,我注意到在Safari中设置的localStorage不能通过调用主屏幕图标来提供相同的页面,即使cookie已经转移!因此,第一次从图标调用引导程序时,它将重新加载文件,即使它们之前已加载到Safari中。此外,我必须明确地阻止加载器被缓存,因为当其余文件更新时它没有从服务器重新加载。

答案 2 :(得分:0)

你是对的。最终它是清单中的网络部分。

我认为加载应用程序的网站是自动包含的,你不需要弄乱它,但事实并非如此。您需要将该网站放在网络部分。