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


当前回答

我发现了一个变通办法,这让我很好奇为什么它能起作用。在阅读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,就会得到更新的内容。

其他回答

我希望这能对其他在这个问题上绞尽脑汁的开发人员有所帮助。我发现以下任何一个阻止Safari在iOS 6上缓存POST响应:

在请求头中添加[cache-control: no-cache] 添加一个可变URL参数,如当前时间 在响应头中添加[pragma: no-cache] 在响应头中添加[cache-control: no-cache]

我的解决方案是以下在我的Javascript(我所有的AJAX请求是POST)。

$.ajaxSetup({
    type: 'POST',
    headers: { "cache-control": "no-cache" }
});

我还在许多服务器响应中添加了[pragma: no-cache]标头。

如果您使用上述解决方案,请注意任何设置为global: false的$.ajax()调用都不会使用在$. ajaxsetup()中指定的设置,因此您将需要再次添加头部。

我在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);

简单的解决方案,所有的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,请检查您所选择的库的文档。它们可能有相似的功能。

它与ASP一起工作。在IIS中添加pragma:no-cache头。Cache-Control: no-cache不够。

我在一个PhoneGap应用程序中也遇到了这个问题。我用JavaScript函数getTime()解决了这个问题,方法如下:

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

我花了几个小时才想明白。如果苹果能通知开发者这个缓存问题就好了。