Depuis la mise à jour vers iOS 6, nous constatons que la vue web de Safari prend la liberté de mettre en mémoire cache $.ajax
appels. Nous sommes dans le contexte d'une application PhoneGap et nous utilisons donc la WebView Safari. Notre site $.ajax
Les appels sont POST
et nous avons mis le cache à false {cache:false}
mais c'est toujours le cas. Nous avons essayé d'ajouter manuellement un TimeStamp
aux en-têtes mais cela n'a pas aidé.
En approfondissant nos recherches, nous avons découvert que Safari ne renvoie des résultats en cache que pour les services Web dont la signature de fonction est statique et ne change pas d'un appel à l'autre. Par exemple, imaginez une fonction appelée comme suit :
getNewRecordID(intRecordType)
Cette fonction reçoit les mêmes paramètres d'entrée à plusieurs reprises, mais les données qu'elle renvoie doivent être différentes à chaque fois.
Dans sa hâte de rendre iOS 6 impressionnant, Apple a dû être trop heureux avec les paramètres du cache. Quelqu'un d'autre a-t-il constaté ce comportement sur iOS 6 ? Si oui, quelle en est la cause exacte ?
La solution que nous avons trouvée consiste à modifier la signature de la fonction de la manière suivante :
getNewRecordID(intRecordType, strTimestamp)
et ensuite toujours passer dans un TimeStamp
et de rejeter cette valeur du côté du serveur. Cela permet de contourner le problème.
1 votes
Y a-t-il une confirmation d'Apple à propos de ce problème ?
191 votes
C'est absolument choquant. Nous venons également de passer deux heures à essayer de comprendre pourquoi quelque chose a cessé de fonctionner. Notre login AJAX qui fait un POST (et qui a des en-têtes pour empêcher la mise en cache également) est mis en cache par Safari et renvoie le même JSON que la dernière fois sans même essayer le serveur... incroyable ! Nous allons devoir trouver une solution, mais il ne faut jamais mettre en cache un POST, c'est de la folie.
0 votes
Nous avons testé une application phonegap existante qui utilise Strophe pour XMPP et tout semble fonctionner sans problème.
0 votes
J'ai eu des problèmes similaires avec Chrome sur le bureau après avoir activé le manifeste du cache. Apparemment, cela déclenche une mise en cache agressive et j'ai défini des en-têtes de cache sans résultat.
0 votes
Merci de mettre à jour votre réponse. Cela m'est arrivé en essayant de développer une application web cela ne m'est arrivé qu'avec des requêtes POST ajax également.
16 votes
Publiez votre solution comme une réponse plutôt que comme une mise à jour de la question.
50 votes
Les requêtes POST sont non-idempotentes, ce qui signifie qu'elles ne doivent pas être mises en cache. sauf si la réponse le conseille spécifiquement via ses en-têtes de réponse.
0 votes
@Kieran Non seulement cela brise vos efforts actuels, mais aussi toutes les applications web précédentes qui utilisent POST...
1 votes
Juste pour savoir, vous avez essayé d'envoyer une requête ajax normale sans utiliser jQuery/autre bibliothèque, n'est-ce pas ? Juste pour vérifier que ce n'est pas la bibliothèque qui fait quelque chose de bizarre.
6 votes
Pour qu'Apple corrige ce problème, déposez un bogue à l'adresse suivante bugreport.apple.com . J'ai fait la même chose.
0 votes
Je n'ai pas d'appareil iOS 6 sous la main... Est-ce que cela se produit uniquement avec les appels AJAX, ou est-ce que les réponses aux soumissions POST du formulaire sont également mises en cache ? Et cela se produit-il dans le navigateur Safari, ou seulement lorsqu'il est utilisé comme WebView ?
1 votes
Apparemment, vous pouvez mettre en cache un POST dans certaines circonstances, mais vous ne devez renvoyer le contenu du cache qu'en réponse à un GET ultérieur approprié. Pas à d'autres POST.
0 votes
Il semble que les dernières versions de Chrome fassent de même. J'ai dû ajouter
Cache-Control: max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate
à mon application web qui fonctionnait bien avec les versions précédentes de Chrome.11 votes
Mark Nottingham (président du groupe de travail HTTPbis de l'IETF) a écrit un billet de blog intéressant à ce sujet aujourd'hui : mnot.net/blog/2012/09/24/caching_POST
0 votes
C'est la nouveauté d'iOS Safari. Je pense que les gens vont progressivement s'habituer et l'accepter tel qu'il est.
0 votes
Le message est arrivé sur arstechnica : arstechnica.com/apple/2012/09/
0 votes
@BenjaminBrizzi, je suis d'accord, en particulier la partie concernant l'exception Content-Location. Cependant, il enterre l'idée que "même sans le bénéfice de ce contexte, ils violent toujours clairement la spécification ; la permission originale de mettre en cache dans 2616 était conditionnée par l'existence d'informations explicites sur la fraîcheur (en fait, Expires ou Cache-Control : max-age)".
0 votes
@Imdad, j'espère vraiment que non. Apple doit corriger son bug.
0 votes
J'ai implémenté mon correctif côté serveur pour cela mais pour qu'il soit efficace, je dois désinstaller l'application et la réinstaller - donc tous mes utilisateurs devront-ils faire la même chose pour commencer à voir de nouvelles données ? C'est une décision ridicule de la part d'Apple.
2 votes
Quelqu'un sait-il si cela est corrigé dans les versions ultérieures d'IOS ?
1 votes
Essayez d'ajouter l'horodatage à l'URL example.com/my/url?t=$time_variable
0 votes
Ce comportement existe toujours
0 votes
Toujours des exits pour les requêtes get sur ios 12.1.3 --> j'ai dû ajouter un paramètre de requête timestamp. le plus ennuyeux --> aucune information sur l'utilisation de résultats en cache dans la console de débogage, lorsque j'utilise chrome sous Windows pour voir ce qui se passe : je n'ai découvert cela que parce qu'il manquait une requête, qui devrait être envoyée à une api