iPhone应用程序缓存和XMLHttpRequest

iPhone应用程序缓存和XMLHttpRequest,iphone,xmlhttprequest,Iphone,Xmlhttprequest,我有一个WebApp,我一直在尝试离线工作。WebApp太大,甚至太小,无法简单地使用应用程序缓存(下载东西,但我最终得到一个window.applicationCache错误)。我试图使用XMLHttpRequest来获取较大的脚本和主html,并将它们保存在本地存储中,只在应用程序缓存中保存一个小的加载程序脚本。我看到的问题是,当本地提供加载程序脚本时,XMLHttpRequest返回一个网络错误。当缓存下载时,不会返回任何错误,并且工作正常。当我关闭应用程序缓存时,加载程序工作正常,但当然

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

我尝试了
setRequestHeader(“缓存控制”,“无缓存”)
,但没有帮助


有人有线索吗?

我想我找到了解决办法。这可能对其他人有用

我将加载程序分为两个单独的HTML文件:一个使用XMLHttpRequest获取所有必需的文件并将其放入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中加载。此外,我还必须明确防止加载程序被缓存,因为在更新其余文件时,加载程序没有从服务器重新加载。

我想我找到了一个解决方案。这可能对其他人有用

我将加载程序分为两个单独的HTML文件:一个使用XMLHttpRequest获取所有必需的文件并将其放入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中加载。此外,我还必须明确防止加载程序被缓存,因为在更新其余文件时,加载程序没有从服务器重新加载。

清单中的网络:部分是什么样子的

我发现,如果我不允许通配符网络流量,它就不会加载XMLHttpRequest。因此,将其更改为:

网络: *


这是我们的窍门。

您的清单中的网络:部分是什么样子的

我发现,如果我不允许通配符网络流量,它就不会加载XMLHttpRequest。苏樟宜