1101 Stimmen

Legt Safari unter iOS 6 $.ajax-Ergebnisse zwischen?

Seit dem Upgrade auf iOS 6 nimmt sich die Webansicht von Safari die Freiheit, zwischenzuspeichern $.ajax ruft. Dies geschieht im Kontext einer PhoneGap-Anwendung, die also die Safari WebView verwendet. Unser $.ajax Anrufe sind POST Methoden und wir haben den Cache auf false gesetzt {cache:false} aber das Problem tritt immer noch auf. Wir haben versucht, manuell eine TimeStamp zu den Kopfzeilen hinzugefügt, aber das hat nicht geholfen.

Wir haben weitere Nachforschungen angestellt und festgestellt, dass Safari nur bei Webdiensten mit einer statischen Funktionssignatur, die sich von Aufruf zu Aufruf nicht ändert, Ergebnisse aus dem Cache zurückgibt. Stellen Sie sich zum Beispiel eine Funktion vor, die etwa so heißt:

getNewRecordID(intRecordType)

Diese Funktion erhält immer wieder dieselben Eingabeparameter, aber die Daten, die sie zurückgibt, sollten jedes Mal anders sein.

In der Eile, mit der Apple iOS 6 zum Laufen bringen wollte, haben sie sich wohl zu sehr mit den Cache-Einstellungen begnügt. Hat noch jemand dieses Verhalten bei iOS 6 beobachtet? Wenn ja, was genau ist die Ursache?


Die Abhilfe, die wir gefunden haben, besteht darin, die Funktionssignatur so zu ändern, dass sie etwa so aussieht:

getNewRecordID(intRecordType, strTimestamp)

und geben Sie dann immer eine TimeStamp und verwerfen Sie diesen Wert einfach auf der Serverseite. Auf diese Weise lässt sich das Problem umgehen.

6voto

Lars Høidahl Punkte 400

Ein schneller Workaround für GWT-RPC-Dienste ist es, dies zu allen Remote-Methoden hinzuzufügen:

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

5voto

Brian Ogden Punkte 17156

Dinge, die NICHT ARBEITEN für mich mit einem iPad 4/iOS 6:

Mein Antrag enthält: Cache-Kontrolle:no-cache

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

Hinzufügen von cache: false zu meinem jQuery-Ajax-Aufruf

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

Nur das hier hat den Zweck erfüllt:

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

5voto

fbader Punkte 139

Um dieses Problem für WebApps, die dem Startbildschirm hinzugefügt wurden, zu beheben, müssen die beiden oben genannten Workarounds befolgt werden. Die Zwischenspeicherung muss auf dem Webserver ausgeschaltet werden, um zu verhindern, dass neue Anfragen zwischengespeichert werden, und es muss eine zufällige Eingabe zu jeder Post-Anfrage hinzugefügt werden, damit Anfragen, die bereits zwischengespeichert wurden, durchgehen können. Bitte beachten Sie meinen Beitrag:

iOS6 - Gibt es eine Möglichkeit, zwischengespeicherte Ajax-POST-Anfragen für eine dem Startbildschirm hinzugefügte Webapp zu löschen?

WARNUNG: an alle, die einen Workaround implementiert haben, indem sie einen Zeitstempel zu ihren Anfragen hinzugefügt haben, ohne das Caching auf dem Server zu deaktivieren. Wenn Ihre App zum Startbildschirm hinzugefügt wird, wird JEDE Post-Antwort jetzt zwischengespeichert, das Löschen des Safari-Caches löscht es nicht und es scheint nicht abzulaufen. Es sei denn, jemand hat eine Möglichkeit, es zu löschen, sieht dies wie ein potenzielles Speicherleck!

4voto

Spiff Punkte 3524

Das ist das Workaround für GWT-RPC

class AuthenticatingRequestBuilder extends RpcRequestBuilder 
{
       @Override
       protected RequestBuilder doCreate(String serviceEntryPoint) 
       {
               RequestBuilder requestBuilder = super.doCreate(serviceEntryPoint);           
               requestBuilder.setHeader("Cache-Control", "no-cache");

               return requestBuilder;
       }
}

AuthenticatingRequestBuilder builder = new AuthenticatingRequestBuilder();
((ServiceDefTarget)myService).setRpcRequestBuilder(builder);

3voto

Alexandre Punkte 6502

Meine Abhilfe in ASP.NET (Pagemethods, Webservice usw.)

protected void Application_BeginRequest(object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X