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


当前回答

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

这招对我很管用:

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

其他回答

从我自己的博客文章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.

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

虽然我的登录和注册页面在Firefox, IE和Chrome中工作得很有魅力……我在IOS和OSX的Safari中一直在努力解决这个问题,几个月前我在SO上找到了一个解决方案。

<body onunload="">

或通过javascript

<script type="text/javascript">
window.onunload = function(e){
    e.preventDefault();
    return;
};
</script>   

这是有点丑陋的事情,但有效的一段时间。

我不知道为什么,但是返回null到onunload事件页面不被缓存在Safari中。

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

最后,我对上传问题有了一个解决方案。

在JavaScript中:

var xhr = new XMLHttpRequest();
xhr.open("post", 'uploader.php', true);
xhr.setRequestHeader("pragma", "no-cache");

在PHP中:

header('cache-control: no-cache');