【问题标题】:Mobile Web App not clearing cache properly移动 Web 应用程序未正确清除缓存
【发布时间】:2012-01-10 09:05:26
【问题描述】:

我一直在为 iPad 开发移动网络应用程序,并且在测试我的代码时遇到了问题。

有时,iPad 会停止正确更新我编写的所有 JS 库,而且似乎是随机的。更新一些代码并发布更改后,我会注意到一些文件会正确更新,而其他文件则没有。在多次清除缓存、电源循环和 wifi 切换后,这种行为仍然存在。

如果我在 safari 中加载应用程序,我没有任何问题,但是当我从应用程序的主屏幕图标加载时,问题再次出现。我已经完成了简单的测试,例如向库中添加一条警报行,并且该警报在除移动网络应用程序窗口之外的任何地方都没有问题触发。然后,似乎又是随机的,问题就消失了,有时需要 5 分钟,有时需要一个小时。

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

有谁知道这是否是 iPad 的一个已知问题?我有什么办法可以解决这个问题吗?

【问题讨论】:

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


【解决方案1】:

要解决这个问题,您应该在链接末尾添加带有数字(不仅仅是数字)的新字母

?v1
?x2
?z3

并且每次你想更新你的脚本时,你应该添加不同的字母和数字(不同的字母是必需的,因为今天许多移动浏览器都忽略了 Javascript/CSS 末尾的所有纯数字链接。)

【讨论】:

    【解决方案2】:

    解决这个问题。 添加指向 Web 应用本身的链接,例如...

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

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

    【讨论】:

      【解决方案3】:

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

      为此,您需要在 iOS 设备上启用 Web Inspector。 转到设置 > Safari > 高级 > Web 检查器(它必须处于活动状态) 而且您必须激活计算机 Safari 上的开发人员菜单。 转到首选项>高级>激活开发人员菜单

      1. 使用 USB 数据线将您的设备连接到计算机
      2. 转到 safari > Developpement > 您的设备名称 > 检查应用程序(该应用程序必须正在运行)
      3. 这将在您的计算机上为网络应用打开检查器
      4. 检查器打开时清除缓存(command + alt + E)
      5. 在检查器仍然打开的情况下刷新计算机上的页面(命令 + R)

      不知何故,Webapp 缓存被清除了,我得到了非缓存代码。

      【讨论】:

      • 这是否也适用于 Windows 版 Safari 的最新版本?
      • 这是在 iPad 上使用 AngularJS 全屏 Web 应用程序时唯一适合我的解决方案。
      【解决方案4】:

      我找到了解决方案!

      但首先是问题: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/

      它还说您可能需要启动您的应用两次:

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

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

      【讨论】:

      • 不幸的是,如果只更改 CSS 文件,这似乎不起作用。我的清单是动态生成的,它包括最新修改文件的最后修改时间戳。如果我在 ipad 上查看 safari,所有更改都是可见的,但是从主屏幕启动时,旧数据缓存在某处。删除主屏幕应用程序、清除 Safari 缓存/cookie 和保存的网站并不能解决问题。当我将应用程序重新添加到主屏幕并从图标启动时 - 它仍会加载旧的缓存 CSS。
      • 这不足以让 webapp 在 iOS 上更新缓存。在 Safari 下它运行良好,但当 web 应用程序从主屏幕启动时就不行了
      • @bench-o 验证器链接已损坏。找不到明显的替代品。现在也不清楚您所说的 manifest.json 是什么清单,而我认为您指的是 Safari 的 appcache 清单?
      【解决方案5】:

      关闭和打开 ipad 对我有用 - 至少在 ios 5 上。没有完全关闭,只需使用 ipad 顶部的睡眠按钮,然后使用主页按钮将其重新打开。在文件末尾附加版本号也可以,但这会很乏味。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这不适用于应用程序底部的主 html/php 文件。真气。
        • 您必须将它们写在清单文件中,例如:CACHE MANIFEST #Version 3.0.10 CACHE: index.html ...
        【解决方案7】:

        我也遇到了同样的问题。

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

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

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

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

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

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

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

            过去,这个问题似乎是随机出现的。我最近进行的所有测试都表明它可以按预期做出响应。

            【讨论】:

              【解决方案10】:

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

              虽然我还没有找到解决问题的“犹太”方法,但总有一种解决方法 - 重命名资源。

              只需更改非刷新文件的名称即可。如果您对foobar.js 未更新有疑问,请将其重命名为foobar2.js更新其他文件中对该资源的引用。这当然可能会让你知道什么很痛苦(尤其是在经过一周的开发后你在foobar12.js),但在我们看到对 iOS 的官方修复或工作刷新技术之前,这是我所知道的让它启动并运行的唯一方法。

              【讨论】:

              • 我也有同样的问题,但是很遗憾,重命名 JS 文件对我不起作用。 :-(
              • @Gunder 我想你可能会在每次遇到某个文件问题时继续重命名它.. :/
              • 重命名源文件并不是一个好的、干净的或专业的方法。为什么不在文件末尾使用?v=10? IE。 somescript.js?v=10。毕竟,这就是它的意义......
              猜你喜欢
              • 1970-01-01
              • 2020-08-07
              • 1970-01-01
              • 1970-01-01
              • 2011-08-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多