移动Web应用程序未正确清除缓存

时间:2011-12-01 07:01:16

标签: javascript ipad html5 mobile-safari web-applications

我一直在开发适用于iPad的移动网络应用,我在测试代码时遇到了问题。

偶尔,看似随机,iPad将停止正确更新我写的所有JS库。更新一些代码并发布更改后,我会注意到一些文件已经正确更新,而其他文件没有。在众多缓存清除,电源循环和wifi切换之后,这种行为仍然存在。

如果我在Safari中加载应用程序我没有问题,但是当我从应用程序的主屏幕图标加载时,问题会重新出现。我已经完成了一些简单的测试,例如向库中添加警报线,除了在mobile-web-app窗口之外,该警报在没有任何问题的情况下触发。然后,看似随机,问题就消失了,有时需要5分钟,有时需要一个小时。

无论应用程序是否使用清单文件,我都会看到此行为。我还试图通过更新清单文件来强制重新缓存这些旧文件,但问题仍然存在。

有人知道这是否是iPad的已知问题?我可以做些什么来解决这个问题吗?

10 个答案:

答案 0 :(得分:11)

对我来说,解决方案是在所有Javascript和CSS链接的末尾添加?v=1。 我已经尝试了一切,然后在另一个Stackoverflow帖子上看到它,它直接工作!那是时候了......

答案 1 :(得分:8)

我得到了解决方案!

但首先问题是:iPad和iPhone在打开应用程序时没有刷新缓存。即使删除应用程序,清除safari缓存,重启设备等等也无法正常工作。

这是解决方案...... taadaa!

你的清单文件必须改变。如果更改,iPad / iPhone将重新加载缓存。因此,只需在清单文件中编写版本号,并在更改内容时进行更改:

# Version: 1.2

因此完整的清单文件可能如下所示:

CACHE MANIFEST

# Version 1.5

NETWORK:
*

CACHE:
index.html
jquery-1.7.2.min.js
images/logo.jpg

它甚至可以重新加载未写入清单文件的图像。我试了好几次。

顺便说一下。别忘了用http://manifest-validator.com

检查您的清单文件

我的来源非常酷,如何关于离线网络应用程序:http://gregsramblings.com/2012/05/28/html5-application-cache-how-to/

它还说你可能需要两次启动你的应用程序:

  

如果清单已更新,浏览器将下载缓存文件列表中的所有文件,但是,此时原始内容已经加载(请记住它已经缓存,因此加载超快!)。

但它总是在第一次尝试时对我有用。

答案 2 :(得分:6)

解决此问题。 添加指向Web App本身的链接,如...

<a href="javascript:top.frames.location.reload();">refresh</a>

它就像iPhone / iPad Safari地址栏上的重新加载按钮一样!

答案 3 :(得分:2)

我花了几个小时试图解决这个问题,似乎应该管理文件缓存的清单文件本身可以缓存,让你的网络应用程序陷入困境。

就我而言,我不希望任何缓存。以下是我解决问题的方法:

  • 在我的服务器上启用mod_expires Apache模块
  • 在与索引文件相同的目录中创建.htaccess文件。该文件应包含行ExpiresDefault A1

这告诉服务器每个文件在访问后都应该过期一秒。我的网络应用程序用作学生会议的调查,因此一次只有一个人使用它。我的解决方案适合我;你可能需要进一步调整它以适合你。

在过去,这个问题似乎是随机出现的。我最近的所有测试都表明它会像人们期望的那样做出回应。

答案 4 :(得分:2)

我无法验证正确清除缓存,但这对我有用:

要执行此操作,您需要在iOS设备上允许Web Inspector。 转到设置&gt; Safari&gt;高级&gt; Web Inspector(必须处于活动状态) 您必须激活计算机Safari上的开发人员菜单。 转到首选项&gt;高级&gt;激活开发人员菜单

  1. 使用USB连接线将设备连接到计算机
  2. 去野生动物园&gt;开发&gt;您的设备名称&gt;检查应用程序(应用程序必须运行)
  3. 这将打开计算机上用于Web应用程序的检查器
  4. 检查员打开时清除缓存(命令+ alt + E)
  5. 检查员仍然打开时刷新计算机上的页面(命令+ R)
  6. 不知何故,Webapp缓存被清除,我得到了非缓存代码。

答案 5 :(得分:1)

我在iPad上的网络应用程序遇到了完全相同的问题 - 有时,随机运行的独立模式下的网络应用程序不会刷新特定资源(HTML / CSS / JS文件),尽管每次都可能应用程序,清除Safari缓存&amp;历史记录,重新启动,重新启动wifi连接,刷新或删除manifest文件或将设备放入微波炉;甚至用大锤证明是徒劳的。

虽然我没有找到一种“犹太教”的方法来修复它,但始终有一种解决方法 - 重命名资源。

只需更改不刷新文件的名称即可。如果您遇到问题,请假设foobar.js未更新,请将其重命名为foobar2.js,并在其他文件中将参考更新为此资源。这当然可能是你知道什么的痛苦(特别是在经过一周的开发后,你在foobar12.js),但直到我们看到官方修复iOS或工作更新技术,这是我知道的唯一方法来启动和运行。

答案 6 :(得分:1)

关闭和打开ipad对我来说 - 至少在ios 5.上没有完全关闭,只需使用ipad顶部的睡眠按钮,然后使用主页按钮将其重新打开。在文件末尾添加版本号也有效,但这非常繁琐。

答案 7 :(得分:0)

我花了很多天时间研究这个问题。它看起来像一个渲染错误,因为我在CSS和HTML中做了一些巧合的改变,因此在屏幕上随机放置按钮使应用程序无法使用。

我确定在经过几天的戳戳和刺激后缓存了CSS,最后尝试重命名文件,@ Neo谈到了。我还更改了.htaccess文件中的缓存控制,因为我一直在使用旧的.htaccess来指示浏览器缓存一年。

tl; dr:删除您的webapp文件的缓存控制(mod_expiresmod_headers),如果您还没有,请使用cache manifest。然后重命名文件并更新HTML中的链接,你应该很好。

答案 8 :(得分:0)

我遇到了同样的问题。

我在这里尝试了不同的建议,并添加了缓存控制而没有运气。我尝试重命名拒绝更新的文件,没有运气。我尝试添加一个缓存清单(之前我有一个,但删除它),没有运气。我尝试了所有常见的事情:删除应用程序,清除缓存,重新启动,重新安装应用程序,没有运气。

唯一对我有用的是重命名我的Web服务器上的虚拟目录。对于每个人来说,这可能不是一个可行的解决方案,但幸运的是,这不是一个真正的问题,因为我正在使用本地IIS服务器进行测试。

答案 9 :(得分:0)

要解决此问题,您应该将新的字母与数字(不仅仅是数字)添加到链接末尾,如下所示:

?v1
?x2
?z3

每次要更新脚本时,都应添加不同的字母和数字(需要使用不同的字母,因为今天许多移动浏览器忽略了Javascript / CSS末尾的所有纯数字链路。)