如何在iPhone主屏幕上清除iOS Web应用程序的缓存?

28

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

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

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

当我将Web应用添加到主屏幕后,每次启动时都会获取最新版本。

但是如果我将meta标签设置为;

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

当我将Web应用添加到主屏幕后,我得到了旧的缓存版本。

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

6个回答

20

你可以尝试向js引入的src属性末尾添加一个唯一的字符串(例如使用时间戳)。请注意,每次刷新都必须更改此唯一字符串,因此您可能需要考虑进行懒加载(这本身可能会解决您的问题):

<script type="text/javascript" src="myScript.js?012345"></script>

这通常会强制浏览器获取脚本的最新版本。或许能够解决问题...


1
同样的技巧也适用于CSS文件。<link rel="stylesheet" href="css/style.css?3432"> - bearroast
以及图片: <img src="foo.png?12345" /> - Alexandre Khoury
难以置信,我为这个问题苦恼了整整一天(对我来说是CSS问题)。Silverlight也存在类似的问题,难以置信两家大公司会出现这种BUG!谢谢! - stvn
嗨,我的问题与受控资源无关,我有一个 cookie 会导致我的应用程序出现无限循环,从而引发“太多重定向”的错误。我尝试了所有可能的方法来删除缓存,但都没有成功。有什么想法可以清除 cookie 吗? - Shahar
好的解决方案,但我的Web应用程序在index.html上加载旧版本:)) - Selirion
是的,在iOS 10中似乎唯一可行的方法是以类似的方式更改HTML文件的URL,并为HTML引用的所有其他文件添加版本控制。这也可以通过添加缓存清单来解决,但前提是您记得最初添加缓存清单。否则,缺少缓存清单的旧HTML将永久缓存,您又需要在HTML URL中添加?version=1了。 :-) - dgatwood

2
这是我用来完全清除缓存的方法:
1. 在Safari中删除包含您的应用程序的选项卡。 2. 在主屏幕中删除应用程序图标。 3. 从内存中关闭 Safari。 4. 进入设置/Safari并按清除缓存。 5. 如果您想确保它起作用,可以重新启动您的iPhone/iPod。

2
这是我以前使用的完全相同的过程,但自从iOS 6以来,似乎不起作用了,主屏幕应用程序仍然会获取缓存数据。 - Oliver Pearmain
请注意,如果您这样做,您将失去已打开的Safari选项卡。如果您有一些有趣的内容需要稍后阅读,它将会消失。 - michal-michalak

1

唯一的问题是,Visual Studio的浏览器链接功能与捆绑不兼容。 - rookie1024
@rookie1024,VS BrowserLink确实可以与捆绑一起使用。您是否在此处使用Mads Kristensen的扩展程序-https://visualstudiogallery.msdn.microsoft.com/9ec27da7-e24b-4d56-8064-fd7e88ac1c40? - HumbleBeginnings
@HumbleBeginnings 不,我不是。然而,我现在知道如果你在调试模式下将 BundleTable.EnableOptimizations 设置为 true,BrowserLink 就会丢失文件跟踪。 - rookie1024

0
借鉴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>

0

这让我非常烦恼。我试图关闭Safari,清除缓存,切换到私人模式,并从主屏幕中删除Web应用程序。这些都没有起作用,但是有效的方法是在Safari中临时加载Web应用程序页面并重新加载。

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


我已经尝试过了。它在iOS 6左右的版本中曾经有效,但在iOS 10中似乎不起作用了。 - dgatwood
是的,我不知道这在最新版本中是否有效。 - Chris
1
在iOS 10中,它也会缓存HTML,因此指定资源的?foo=...也不起作用,因为它从未看到具有新URL的HTML的更新版本。 基本上,在没有缓存清单的情况下,主屏幕Web应用程序的缓存已经彻底破裂了(甚至可能连缓存清单也一样-我还没有尝试过)。 - dgatwood

0
如果您已越狱,请在终端中执行以下操作。
rm ./Library/Caches/com.apple.webapp/Cache.db

我的iOS 5.1.1设备上没有这样的文件,但是我的main.js仍然从缓存中获取(尽管常规Safari可以从服务器获取文件)。 - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接