15

HTML5在过去的一个月里,我一直在开发一个非常复杂的网络应用程序。昨晚我iPhone突然决定缓存所有 JS、CSS 和图像而不加载任何更新的副本。这也发生在我的合作伙伴iPhone身上,所以我假设它会影响我们应用程序的所有用户。

不用说,清除浏览器缓存、删除 Web 应用程序、重新启动手机和重新启动无线连接都无法解决问题。

删除<meta name="apple-mobile-web-app-capable" content="yes">解决了问题,但产生了一个新问题,因为我们需要应用程序像......一个应用程序一样运行。

我们也不打算将旧技巧附加?number到所有脚本、样式表和图像的末尾。这是荒谬的。另外——如果我们要实现这样东西,它必须是某种动态的 JS 实现。我们的应用程序是一个加载大多数脚本的 HTML 页面,并且附加页面是 AJAX 的,附加数据也是通过 AJAX 获得的。我想这可以做到,但我希望有一个更优雅的解决方案。你知道,我觉得我不应该做任何事情,因为这一切都顺利进行了整整一个月。

使用cache-control,expirespragma <meta>标签对我们也没有任何好处,因为这纯粹是一个 iOS Web 应用程序问题。缓存在移动 Safari、移动 Chrome 和所有桌面浏览器中正常工作。iOS 似乎为用户无法清除的应用程序(包括 Web 应用程序)设置了单独的缓存。

貌似很多SO用户都遇到过这个问题,但是我找不到满意的解决方案。有没有遇到类似情况的人解决了这个问题?我可以使用清单文件来指定缓存多个文件吗?似乎清单文件被用来做相反的事情。

4

1 回答 1

6

对于它的价值,并且它不是一个完美的解决方案,我们不得不通过附加查询字符串来解决。我编写了一个 shell 脚本来使这个和其他一些任务更加自动化,你可以查看GitHub 上的源代码。一些细节:

  • 它是为 JS 设计的,但也可以轻松编辑以处理 CSS。
  • 它获取列出的所有文件script_order.txt并使用 Google 的 Closure Compiler 编译它们
  • 尽可能将它们分组为 25kb 以下的块(iPhone 不会缓存超过 25kb pre-gzip 的任何内容,尽管显然这仅适用于浏览器而不是独立的 webapps)
  • 输出带有附加到脚本文件名的<script>标签的 PHP 文件。?v=timestamp如果您正在使用静态 HTML 并且无法包含 PHP 文件,则可以重写输出以将脚本标签附加到您的 index.html 文件中。

另一个非常 hacky 的解决方案是使用.php文件扩展名保存您的 JS/CSS,并在这些文件中将标题设置为如下所示:

<?php
header("content-type: application/javascript");
header('Cache-Control: no-cache');
header('Pragma: no-cache');
?>
window.alert('hello world');

编辑:

将日期设置为未来 2、3 或 4 天,从主屏幕启动应用程序,然后将日期设置为正常也可以。

于 2013-09-22T16:43:57.007 回答