Caching

2 views
Skip to first unread message

Benoit Widemann

unread,
Feb 16, 2012, 3:37:04 AM2/16/12
to cocoahea...@googlegroups.com
Je bute sur un truc idiot : j'ai besoin de charger une page html dans une webview, mais aussi d'être certain qu'aucun cache local n'est utilisé (il s'agit de mesurer le temps de transfert).

Il y a bien le sharedURLCache et la possibilité de le réduire au minimum ou à rien du tout, mais ça ne suffit pas si la page chargée contient des éléments secondaires (images notamment). Tout se passe comme si le webkit disposait d'un autre niveau de cache pour les objets que l'on peut gérer sur Mac avec les classes absentes d'iOS (WebResource par exemple).

J'en arrive à me demander si les images elles-mêmes n'ont pas un cache de backing-store quelque part.

J'ai essayé de bricoler à la volée en supprimant carrément les caches, les prefs, le dossier WebKit de l'appli... rien n'y fait. Le html de base est bien rechargé à chaque fois, mais les éléments secondaires de la page sont toujours repris en local jusqu'à ce que l'appli quitte.

Quelqu'un a une idée ? B.

Cyril Godefroy

unread,
Feb 16, 2012, 3:40:17 AM2/16/12
to cocoahea...@googlegroups.com
Il y aurait bien le fait d'agir coté serveur, mais j'imagine que ce n'est pas possible. En rajoutant un timestamp bidon derrière chaque url d'e ressource, du genre moncss.css?2012323094374

Cyril

> --
> You received this message because you are subscribed to the Google Groups "CocoaHeads France" group.
> To post to this group, send email to cocoahea...@googlegroups.com.
> To unsubscribe from this group, send email to cocoaheads-fra...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/cocoaheads-france?hl=en.
>

Nicolas VERINAUD

unread,
Feb 16, 2012, 3:56:04 AM2/16/12
to cocoahea...@googlegroups.com

Benoit Widemann

unread,
Feb 16, 2012, 5:44:30 PM2/16/12
to cocoahea...@googlegroups.com
On 16 févr. 2012, at 09:40, Cyril Godefroy wrote:

Il y aurait bien le fait d'agir coté serveur, mais j'imagine que ce n'est pas possible. En rajoutant un timestamp bidon derrière chaque url d'e ressource, du genre moncss.css?2012323094374 


Non hélas, impossible d'agir côté serveur. Bien sûr ça aurait été plus simple...


On 16 févr. 2012, at 09:56, Nicolas VERINAUD wrote:

Cet article pourrait t'aider à résoudre ton problème je pense :https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html#//apple_ref/doc/uid/20001843-BAJEAIEE


Pas mieux. J'avais bien sûr essayé de régler le comportement du cache. J'ai l'impression que ça n'agit que sur le request initial et pas sur les ressources secondaires de la page web chargée, les images, etc. Si au lieu de charger le html qui à son tour charge l'image, je charge directement l'image, le "nocache" s'applique alors correctement à l'image, ce qui paraît confirmer ça. Hélas ça ne résoud pas mon problème car il faut que je charge le html...

B.


Olivier Halligon

unread,
Feb 17, 2012, 12:44:54 AM2/17/12
to CocoaHeads France
Dans la méthode delegate
"webView:shouldStartLoadWithRequest:navigationType:" le paramètre
"request" est en fait mutable si tu regardes bien au runtime : plus
qu'un NSURLRequest indiqué par la signature c'est un
NSMutableURLRequest en vrai.
À partir de là tu peux modifier toutes les requêtes de ta webView
avant qu'elles ne soient envoyées — et donc pas que la requête
initiale — et modifier les politiques de cache utilisées pour chaque
requête.

-- Olivier H

On 16 fév, 23:44, Benoit Widemann <ben...@widemann.net> wrote:
> On 16 févr. 2012, at 09:40, Cyril Godefroy wrote:
>
> > Il y aurait bien le fait d'agir coté serveur, mais j'imagine que ce n'est pas possible. En rajoutant un timestamp bidon derrière chaque url d'e ressource, du genre moncss.css?2012323094374
>
> Non hélas, impossible d'agir côté serveur. Bien sûr ça aurait été plus simple...
>
> On 16 févr. 2012, at 09:56, Nicolas VERINAUD wrote:
>
> > Cet article pourrait t'aider à résoudre ton problème je pense :https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptu...

Nicolas VERINAUD

unread,
Feb 17, 2012, 2:27:53 AM2/17/12
to cocoahea...@googlegroups.com
Ok!

J'ai prototypé le problème, il faudrait report un bug concernant ce comportement non?

Il me semble logique que si on spécifie une cache policy au niveau de la requête de la page web cette cache policy doit s'appliquer à toutes les sous-requêtes. Qu'en pensez-vous?

Ou alors je crois qu'il est possible d'intercepter les accès au cache dans le delegate de la requête. À moins que là aussi ça ne s'applique que sur la requête "mère" ?!

Nicolas VERINAUD
STA WebDev & Apple
Sent from my iPhone

Pechoultres Xavier

unread,
Feb 17, 2012, 2:51:01 AM2/17/12
to cocoahea...@googlegroups.com

Le 16 févr. 2012 à 23:44, Benoit Widemann a écrit :

On 16 févr. 2012, at 09:40, Cyril Godefroy wrote:

Il y aurait bien le fait d'agir coté serveur, mais j'imagine que ce n'est pas possible. En rajoutant un timestamp bidon derrière chaque url d'e ressource, du genre moncss.css?2012323094374 


Non hélas, impossible d'agir côté serveur. Bien sûr ça aurait été plus simple...


Mettre un proxy ?




Benoit Widemann

unread,
Feb 17, 2012, 8:51:48 AM2/17/12
to cocoahea...@googlegroups.com

On 17 févr. 2012, at 08:51, Pechoultres Xavier wrote:

Mettre un proxy ?

Pas mal. On n'a pas de contrôle sur les pages chargées mais on pourrait effectivement installer un proxy, qui pourrait modifier à la volée les URL secondaires en ajoutant un suffixe bidon. Je vais explorer cette direction.



On 17 févr. 2012, at 08:27, Nicolas VERINAUD wrote:

J'ai prototypé le problème, il faudrait report un bug concernant ce comportement non?
Il me semble logique que si on spécifie une cache policy au niveau de la requête de la page web cette cache policy doit s'appliquer à toutes les sous-requêtes. Qu'en pensez-vous?

Oui. Je pense que c'est un vrai bug, même s'il ne gêne sans doute pas grand monde en pratique.

Ou alors je crois qu'il est possible d'intercepter les accès au cache dans le delegate de la requête. À moins que là aussi ça ne s'applique que sur la requête "mère" ?!

La webView n'a pas de méthode de délégué pour ça (seule apparaît la requête principale, plus les éventuelles redirections), et le request n'en a pas du tout.



On 17 févr. 2012, at 06:44, Olivier Halligon wrote:

Dans la méthode delegate
"webView:shouldStartLoadWithRequest:navigationType:" le paramètre
"request" est en fait mutable si tu regardes bien au runtime : plus
qu'un NSURLRequest indiqué par la signature c'est un
NSMutableURLRequest en vrai.
À partir de là tu peux modifier toutes les requêtes de ta webView
avant qu'elles ne soient envoyées — et donc pas que la requête
initiale — et modifier les politiques de cache utilisées pour chaque
requête.

Hélas non... les images chargées via un tag <img> dans le html ne déclenchent pas cette méthode de délégué. Sinon ça serait facile...

B.

Reply all
Reply to author
Forward
0 new messages