68 votes

Nettoyage du cache de UIWebview

J'ai utilisé UIWebview pour charger une page web à l'aide de loadRequest: et lorsque je quitte cette scène, j'appelle [self.webView stopLoading]; et relâchez le webView.

Dans le moniteur d'activité, lors du premier lancement, j'ai vu que la mémoire réelle a augmenté de 4 Mo, et lors de plusieurs lancements/chargements, la mémoire réelle n'augmente pas. Elle n'augmente qu'une seule fois.

J'ai vérifié le compte de retenue de webview. Il est correct, c'est-à-dire 0. Je pense que UIWebView met en cache certaines données. Comment puis-je éviter la mise en cache ou supprimer les données mises en cache ? Ou y a-t-il une autre raison à cela ?

128voto

groomsy Points 2350

Je pense en fait qu'il peut conserver les informations en mémoire cache lorsque vous fermez le programme. UIWebView . J'ai essayé de retirer un UIWebView de mon UIViewController , le relâcher, puis en créer un nouveau. La nouvelle version se souvenait exactement de l'endroit où j'étais lorsque je revenais à une adresse sans avoir à tout recharger (elle se souvenait de mes précédentes visites à l'étranger). UIWebView était connectée).

Alors quelques suggestions :

[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];

Cela permet de supprimer une réponse en cache pour une demande spécifique. Il existe également un appel qui supprimera toutes les réponses mises en cache pour toutes les requêtes exécutées sur la page UIWebView :

[[NSURLCache sharedURLCache] removeAllCachedResponses];

Après cela, vous pouvez essayer de supprimer tous les cookies associés avec la fonction UIWebView :

for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

    if([[cookie domain] isEqualToString:someNSStringUrlDomain]) {

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}

Swift 3 :

// Remove all cache 
URLCache.shared.removeAllCachedResponses()

// Delete any associated cookies     
if let cookies = HTTPCookieStorage.shared.cookies {
    for cookie in cookies {
        HTTPCookieStorage.shared.deleteCookie(cookie)
    }
}

0 votes

Et que dire de loadHTMLString:baseURL : ? Il ne semble pas fonctionner lorsque je supprime les cookies et le cache URL...

11 votes

Bonjour, j'ai essayé [[NSURLCache sharedURLCache] removeAllCachedResponses] ;, mais ça ne marche pas, j'ai toujours la même image dans le cache.... Y a-t-il un autre moyen de contourner le problème ?

3 votes

Oui, c'est la même chose, j'obtiens une connexion persistante et je pense que l'UIWebView retient peut-être le jeton trop longtemps. Une idée ?

45voto

ToddH Points 1134

Ne désactivez pas complètement la mise en cache, cela nuirait aux performances de votre application et ce n'est pas nécessaire. L'important est de configurer explicitement le cache au démarrage de l'application et de le purger si nécessaire.

Ainsi, en application:DidFinishLaunchingWithOptions: configurez les limites du cache comme suit :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    int cacheSizeMemory = 4*1024*1024; // 4MB
    int cacheSizeDisk = 32*1024*1024; // 32MB
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
    [NSURLCache setSharedURLCache:sharedCache];

    // ... other launching code
}

Une fois que vous l'avez correctement configuré, lorsque vous avez besoin de purger le cache (par exemple en applicationDidReceiveMemoryWarning ou lorsque vous fermez un UIWebView ) font simplement :

[[NSURLCache sharedURLCache] removeAllCachedResponses];

et vous verrez que la mémoire est récupérée. J'ai fait un blog sur ce sujet ici : http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

0 votes

Et aussi plus de "plus" si je peux. Je pense que cela a amélioré les performances ET résolu mon problème de mise en cache trop agressive.

10voto

InsertWittyName Points 2651

Vous pouvez désactiver la mise en cache en procédant comme suit :

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

ARC :

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

0 votes

Dans mon cas, je n'avais pas du tout besoin d'une mise en cache et cette réponse m'a été très utile. Pour les autres qui choisissent cette direction : Ces lignes sont également placées dans le didFinishLaunchingWithOptions. La dernière ligne (sharedCache release) devrait être omise dans les applications plus récentes car ARC s'en occupe maintenant pour vous.

2voto

Chris Hawkins Points 41

Je pense que l'utilisation de la mémoire que vous constatez ne provient pas du contenu de la page, mais plutôt du chargement de UIWebView et de toutes les bibliothèques WebKit qu'il prend en charge. J'adore le contrôle UIWebView, mais c'est un contrôle "lourd" qui nécessite un très gros bloc de code.

Ce code est un grand sous-ensemble du navigateur Safari d'iOS, et initialise probablement un grand nombre de structures statiques.

0 votes

Mais lorsque je libère le webview, il est censé libérer le contenu en cache également... Mais il ne libère pas le contenu en cache.... Comment supprimer les données mises en cache

0 votes

En lisant votre message original, le symptôme est que votre utilisation de la mémoire augmente, mais ne diminue pas lorsque vous arrêtez d'utiliser UIWebView. Ma suggestion est que l'utilisation de la mémoire n'est PAS le contenu des caches, mais plutôt le code et les structures de données chargés par UIWebView. Vérifiez que vous avez libéré le contrôle UIWebView, et pas seulement le contenu web que vous avez affiché.

0voto

Evgeni Petrov Points 217

Je charge des pages html à partir de Documents et si elles ont le même nom de fichier css UIWebView il semble qu'il ne rejette pas les règles css précédentes. Peut-être parce qu'elles ont la même URL ou quelque chose comme ça.

J'ai essayé ça :

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

J'ai essayé ceci :

[[NSURLCache sharedURLCache] removeAllCachedResponses];

Je charge la page initiale avec :

NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];

Il refuse de jeter ses données en cache ! C'est frustrant !

Je fais cela dans une application PhoneGap (Cordova). Je ne l'ai pas essayé dans une UIWebView isolée.

Mise à jour1 : J'ai trouvé ce .
La modification des fichiers html semble cependant très compliquée.

0 votes

Update2 : J'ai réussi à résoudre ce problème. Juste après avoir fait une nouvelle demande, je recharge également la vue web. Pour une raison quelconque, cela charge le css correctement.

0 votes

Hé, je sais que c'est vieux, mais qu'est-ce que tu veux dire par recharger le webview ? Appeler [webview reload] ne semble pas faire quoi que ce soit et je suis dans la même position que vous étiez, ont tout essayé et ne veulent pas ajouter une chaîne aléatoire à chaque script et url css.

0 votes

C'était en 2012 sur iOS6, probablement que le hack ne fonctionne plus. Juste après le chargement, j'ai appelé reload. Et c'est tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X