如何清除主屏幕上 IOS Web App 的缓存?

Posted

技术标签:

【中文标题】如何清除主屏幕上 IOS Web App 的缓存?【英文标题】:How can I clear the cache of an IOS Web App on the Homescreen? 【发布时间】:2011-12-25 04:12:30 【问题描述】:

我正在使用 JQTouch 在主屏幕上使用元标记“apple-mobile-web-app-capable”创建一个 Web 应用程序,但无论我从设置中清除缓存多少次,Web 应用程序的 javascript 仍然是较旧的缓存版本。

奇怪的是,如果我将元标记的内容设置为;

<meta name="apple-mobile-web-app-capable" content="no" />

...然后将 Web 应用程序添加到主屏幕,我会在启动时获得最新版本。

但是,如果我将元标记设置为;

<meta name="apple-mobile-web-app-capable" content="yes" />

...然后将 Web 应用程序添加到主屏幕,我会得到较旧的缓存版本。

PS。我可以确认只有 javascript 不会刷新。

【问题讨论】:

【参考方案1】:

根据 SquareFeet 所说的,每次都可以使用 php 自动拉下新文件,并在文件名后附加一个唯一的 GET 标记。例如:

<link rel="stylesheet" type="text/css" href="/css/global.css?
   <?php echo(mt_rand(10000000, 99999999)); ?>
" />

理论上,同样的任务可以使用 JavaScript 完成,尽管需要对 Web 服务器进行一些修改:

<link rel="stylesheet" type="text/css" href="/css/global.css?
   <div id="id"></div>
" />

<script language="Javascript" type="text/javascript">
   document.getElementById("id").innerhtml = Math.floor((Math.random() * 10000) + 1);
</script>

【讨论】:

【参考方案2】:

这让我彻底疯了。我尝试杀死 Safari,清除缓存,切换到私人模式,并从主屏幕中删除 Web 应用程序。这些都不起作用,但起作用的是 在 Safari 本身中临时加载 Web 应用程序页面并重新加载

如果您使用的是add to home screen,则可以将 ?web_app_ready=1 添加到安装 URL。由于这不是最终用户过程,因此向每个脚本(上面的答案)添加查询字符串可能对非开发人员环境更有效。

【讨论】:

我试过了。它曾经在 ios 6 左右工作,但在 iOS 10 似乎不工作。 是的,我不知道这在最新版本中是否有效。 而且在 iOS 10 中,它也会缓存 HTML,因此为资源指定 ?foo=... 不起作用,因为它永远不会看到带有新 URL 的 HTML 的更新版本.基本上,主屏幕 Web 应用程序的缓存在这一点上已经无可救药地被破坏了,除非你有一个缓存清单(甚至可能——我还没有尝试过)。【参考方案3】:

我发现在 ASP.NET MVC 中使用bundling 功能为我解决了这个问题。

它会自动生成表单的捆绑链接:

http://www.domain.com/MvcBM_time/bundles/AllMyScripts?v=r0sLDicvP58AIXN_mc3QdyVvVj5euZNzdsa2N1PKvb81

如果捆绑包中的任何文件发生更改,v= 之后的令牌也会更改,从而保证浏览器对捆绑包的请求将获得最新的捆绑包。

【讨论】:

唯一的问题是 Visual Studio 的浏览器链接功能不适用于捆绑。 @rookie1024 VS BrowserLink 实际上可以与捆绑一起使用。你在这里使用 Mads Kristensen 的扩展 - visualstudiogallery.msdn.microsoft.com/… 吗? @HumbleBeginnings 不,我不是,但我现在知道只有在调试模式下将 BundleTable.EnableOptimizations 设置为 true 时,BrowserLink 才会丢失文件跟踪。【参考方案4】:

如果你越狱了,就在终端里做这个

rm ./Library/Caches/com.apple.webapp/Cache.db

【讨论】:

我的 iOS 5.1.1 设备上没有这样的文件,我的 main.js 仍然是从缓存中获取的(虽然常规 safari 从服务器获取文件正常)【参考方案5】:

这是一种让我完全清除缓存的方法:

1-在 Safari 中删除您的应用所在的标签。 2-删除主屏幕中应用程序的图标。 3-Kill safari 来自记忆。 4-转到设置/Safari 并按清除缓存。5-如果您想确保 iPhone/iPod 正常工作,您可以重新启动它

【讨论】:

这与我以前使用的过程完全相同,但由于 iOS 6 似乎无法正常工作,主屏幕应用程序仍会获取缓存数据。 请注意,如果您这样做您将丢失已打开的 Safari 标签页。如果你有一些有趣的东西供以后阅读,它就会消失。【参考方案6】:

您可以尝试在 js 包含的 src 属性的末尾添加一个唯一字符串(例如,使用时间戳)。请记住,您必须为每次要执行的刷新更改此唯一字符串,因此您可能需要考虑进行延迟加载(这本身可能会解决您的问题): &lt;script type="text/javascript" src="myScript.js?012345"&gt;&lt;/script&gt;

这通常会强制浏览器获取最新版本的脚本。可能会工作......

【讨论】:

同样的技术适用于 CSS 文件。 还有图片:&lt;img src="foo.png?12345" /&gt; 难以置信,我已经为此烦恼了一整天(我的 css 问题)。 Silverlight也存在类似的问题,难以置信2个市长公司出这种BUG!谢谢! 嗨,我的问题与受控资源无关,我有一个 cookie,它会产生无限循环,导致我的应用出现“重定向过多”错误。我尝试了所有可能的方法来删除缓存但没有成功。任何想法如何清除 cookie? 很好的解决方案,但我的网络应用程序在 index.html 上加载旧版本 :))

以上是关于如何清除主屏幕上 IOS Web App 的缓存?的主要内容,如果未能解决你的问题,请参考以下文章

iPad 远程调试

ios如何清除应用数据

iOS web缓存策略以及手动清除缓存

是否可以清除 iOS 和 Android webkit 中的缓存?

ios 清除一个app的缓存

APP开发-Vue3+Vant+Html5+ 实现管理应用缓存以及清除缓存