自从升级到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参数,并在服务器端丢弃这个值。这就解决了这个问题。


当前回答

我在iPad 4/iOS 6上遇到的问题:

我的请求包含:Cache-Control:no-cache

//asp.net's:
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)

添加缓存:false到我的jQuery ajax调用

 $.ajax(
        {
            url: postUrl,
            type: "POST",
            cache: false,
            ...

只有这招管用:

var currentTime = new Date();
var n = currentTime.getTime();
postUrl = "http://www.example.com/test.php?nocache="+n;
$.post(postUrl, callbackFunction);

其他回答

从我自己的博客文章iOS 6.0缓存Ajax post请求:

如何修复:有多种方法可以防止缓存请求。推荐的方法是添加一个无缓存头。事情是这样的。

jQuery:

检查iOS 6.0并像这样设置Ajax头:

$.ajaxSetup({ cache: false });

ZeptoJS:

检查iOS 6.0并像这样设置Ajax头:

$.ajax({
    type: 'POST',
    headers : { "cache-control": "no-cache" },
    url : ,
    data:,
    dataType : 'json',
    success : function(responseText) {…}

服务器端

Java:

httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

确保在将任何数据发送到客户端之前将其添加到页面顶部。

.NET

Response.Cache.SetNoStore();

Or

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

PHP

header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.

简单的解决方案,所有的web服务请求,假设你使用jQuery:

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    // you can use originalOptions.type || options.type to restrict specific type of requests
    options.data = jQuery.param($.extend(originalOptions.data||{}, { 
      timeStamp: new Date().getTime()
    }));
});

点击这里阅读更多关于jQuery预过滤器调用的内容。

如果您没有使用jQuery,请检查您所选择的库的文档。它们可能有相似的功能。

我建议将函数签名修改成这样:

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

为了解决添加到主屏幕的WebApps的这个问题,需要遵循投票最多的两个解决方案。需要在web服务器上关闭缓存,以防止新的请求继续缓存,并且需要在每个post请求中添加一些随机输入,以便已经缓存的请求能够通过。请参考我的帖子:

iOS6 -有一种方法来清除缓存ajax POST请求的webapp添加到主屏幕?

警告:给那些通过在请求中添加时间戳而没有关闭服务器缓存来实现解决方案的人。如果你的应用被添加到主屏幕,每一个帖子的响应现在都将被缓存,清除safari缓存不会清除它,它似乎不会过期。除非有人有办法清除它,否则这看起来像一个潜在的内存泄漏!

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

这招对我很管用:

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