我一直在开发一个相当复杂的 HTML5
过去一个月的网络应用程序。昨晚我的iPhone
突然决定缓存所有 JS、CSS 和图像,而不加载任何更新的副本。这发生在我伙伴的 iPhone
上也是,所以我假设它会影响我们应用程序的所有用户。
不用说,清除浏览器缓存、删除网络应用程序、重启手机和重启无线连接都无法解决问题。
删除 <meta name="apple-mobile-web-app-capable" content="yes">
解决了问题,但又产生了新问题,因为我们需要应用程序像……应用程序一样运行。
我们不会绕过旧技巧 ?number
到我们所有脚本、样式表和图像的末尾。这是荒谬的。另外——如果我们要实现这样的东西,它必须是某种动态 JS 实现。我们的应用程序是一个加载大多数脚本的 HTML 页面,其他页面通过 AJAX 加载,其他数据也通过 AJAX 获取。我想这可以做到,但我希望有一个更优雅的解决方案。你知道,我觉得我不应该做任何事情,因为这一切都顺利进行了整整一个月。
使用 cache-control
, expires
, 和 pragma
<meta>
标签对我们也没有任何好处,因为这纯粹是一个 iOS 网络应用程序问题。缓存在移动版 Safari、移动版 Chrome 和所有桌面浏览器中正常工作。 iOS 似乎有一个单独的应用程序缓存,包括用户无法清除的网络应用程序。
好像很多SO用户都遇到过这个问题,但是我找不到满意的解决方案。有没有人在类似情况下解决了这个问题?我可以使用 list 文件来指定不 缓存多个文件吗?似乎 list 文件用于执行相反的操作。
最佳答案
考虑到它的值(value),而且它不是一个完美的解决方案,我们不得不通过附加查询字符串来解决。我写了一个 shell 脚本来使这个和其他一些任务更加自动化,你可以在 GitHub 上查看源代码。 .一些细节:
- 它专为 JS 而设计,但也可以轻松编辑以处理 CSS。
- 它获取
script_order.txt
中列出的所有文件并使用 Google 的 Closure Compiler 编译它们 - 尽可能将它们分组为 25kb 以下的 block (iPhone 不会缓存超过 25kb 的 gzip 之前的任何内容,尽管显然这仅扩展到浏览器而不是独立的网络应用程序)
- 输出一个 PHP 文件
<script>
具有?v=timestamp
的标签附加到脚本文件名。如果您使用的是静态 HTML 且无法包含 PHP 文件,则可以重写输出以将脚本标记附加到 index.html 文件。
另一个非常 hacky 的解决方案是用 .php
保存你的 JS/CSS文件扩展名,并在这些文件中将 header 设置为如下内容:
<?php
header("content-type: application/javascript");
header('Cache-Control: no-cache');
header('Pragma: no-cache');
?>
window.alert('hello world');
编辑:
将日期设置为 future 2、3 或 4 天后,从主屏幕启动应用程序,然后将日期设置回正常也可以达到目的。
关于iphone - iOS Web App - 如何处理过度的应用程序缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576069/