自从升级到iOS 6以来,我们看到Safari的web视图可以自由缓存$。ajax调用。这是在一个PhoneGap应用程序的上下文中,所以它使用Safari WebView。我们的美元。ajax调用是POST方法,我们有缓存设置为false {cache:false},但这仍然发生。我们尝试手动添加一个时间戳到头部,但它没有帮助。

我们做了更多的研究,发现Safari只返回具有静态函数签名的web服务的缓存结果,并且在每次调用之间不会改变。例如,想象一个函数是这样的:

getNewRecordID(intRecordType)

这个函数一遍又一遍地接收相同的输入参数,但它每次返回的数据应该是不同的。

苹果一定是急于让iOS 6运行得令人印象深刻,他们对缓存设置太满意了。有人在iOS 6上看到过这种行为吗?如果是的话,到底是什么原因造成的呢?


我们发现的解决方法是修改函数签名,像这样:

getNewRecordID(intRecordType, strTimestamp)

然后总是传递一个TimeStamp参数,并在服务器端丢弃这个值。这就解决了这个问题。


当前回答

根据应用程序的不同,你可以在iOS 6中使用Safari>Advanced>Web Inspector来解决这个问题,所以这对这种情况很有帮助。

将手机连接到Mac电脑上的Safari浏览器,然后使用开发人员菜单来解决web应用程序的问题。

在更新到iOS6后,清除iPhone上的网站数据,包括使用Web View的特定应用程序。只有一个应用程序有问题,这解决了它在IOS6 Beta测试的方式,从那以后没有真正的问题。

你可能也需要看看你的应用,如果在自定义应用的WebView中,检查NSURLCache。

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003754

我想这取决于你的问题的真正性质,实现等等。

裁判:美元。ajax调用

其他回答

GWT-RPC服务的一个快速解决方法是将其添加到所有远程方法中:

getThreadLocalResponse().setHeader("Cache-Control", "no-cache");

我有同样的问题,一个web应用程序从ASP获取数据。网网络服务

这招对我很管用:

public WebService()
{
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    ...
}

虽然添加缓存破坏者参数使请求看起来不同,这似乎是一个可靠的解决方案,但我不建议这样做,因为它会损害任何依赖于实际缓存发生的应用程序。使api输出为正确的头是可能的最佳解决方案,即使这比向调用者添加缓存破坏者稍微困难一些。

这是Baz1nga对答案的更新。因为选项。data不是一个对象,而是一个字符串,我只是把时间戳连接起来:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  if (originalOptions.type == "post" || options.type == "post") {

    if (options.data && options.data.length)
      options.data += "&";
    else
      options.data = "";

    options.data += "timeStamp=" + new Date().getTime();
  }
});

我发现了一个变通办法,这让我很好奇为什么它能起作用。在阅读Tadej关于ASP的回答之前。NET web服务,我试图想出一些可行的方法。

我并不是说这是一个很好的解决方案,我只是想在这里记录一下。

主页:包括JavaScript函数checkStatus()。该方法调用另一个方法,该方法使用jQuery AJAX调用更新html内容。我使用setInterval调用checkStatus()。当然,我遇到了缓存问题。

解决方案:使用另一个页面调用更新。

在主页面上,我设置了一个布尔变量runUpdate,并在body标签中添加了以下内容:

<iframe src="helper.html" style="display: none; visibility: hidden;"></iframe>

在help .html中:

<meta http-equiv="refresh" content="5">
<script type="text/javascript">
    if (parent.runUpdate) { parent.checkStatus(); }
</script>

因此,如果从主页调用checkStatus(),我将获得缓存的内容。如果从子页调用checkStatus,就会得到更新的内容。