web-dev-qa-db-fra.com

Effacement du cache UIWebview

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

Dans le moniteur d’activité au premier lancement, j’ai vu que la mémoire réelle augmentait de 4 Mo, et lors de plusieurs lancements/chargement, la mémoire réelle n’augmentait pas. Il augmente seulement une fois.

J'ai vérifié le nombre de conservations de la vue Web. C’est correct, c’est-à-dire 0. Je pense que UIWebView met en cache certaines données. Comment éviter la mise en cache ou supprimer les données en cache? Ou y a-t-il une autre raison à cela?

66
Chandan Shetty SP

Je pense en fait que les informations en cache peuvent être conservées lorsque vous fermez le UIWebView. J'ai essayé de supprimer un UIWebView de mon UIViewController, de le relâcher, puis d'en créer un nouveau. Le nouveau s'est rappelé exactement où je me trouvais quand je suis retourné à une adresse sans avoir à tout recharger (il se souvenait que mon précédent UIWebView était connecté).

Donc quelques suggestions:

[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];

Cela supprimerait une réponse mise en cache pour une demande spécifique. Il existe également un appel qui supprimera toutes les réponses en cache pour toutes les demandes exécutées sur le UIWebView:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

Après cela, vous pouvez essayer de supprimer tous les cookies associés avec le 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)
    }
}
125
groomsy

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

Donc dans 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 configuré correctement, lorsque vous devez purger le cache (par exemple, dans applicationDidReceiveMemoryWarning ou lorsque vous fermez un UIWebView), faites simplement:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

et vous verrez que la mémoire est récupérée. J'ai blogué à propos de ce problème ici: http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

45
ToddH

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];
9
InsertWittyName

Rapide 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)
    }
}
6
CodeOverRide

Je ne pouvais pas changer le code, j'avais donc besoin d'une ligne de commande à des fins de test et j'ai pensé que cela pourrait aider quelqu'un:

Les caches spécifiques à une application sont stockés dans ~/Library/Caches/<bundle-identifier-of-your-app> _, supprimez-le simplement comme suit et ouvrez de nouveau votre application.

rm -rf ~/Library/Caches/com.mycompany.appname/

2
PnotNP

Ma supposition éclairée est que l'utilisation de la mémoire que vous voyez ne provient pas du contenu de la page, mais du chargement de UIWebView et de toutes les bibliothèques associées à WebKit. J'aime le contrôle UIWebView, mais c'est un contrôle "lourd" qui extrait un très gros bloc de code.

Ce code est un grand sous-ensemble du navigateur iOS Safari et initialise probablement un grand corps de structures statiques.

2
Chris Hawkins

Après diverses tentatives, seul cela fonctionne bien pour moi (sous iOS 8):

NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
1
Blasco73

Pour Swift 2.0:

let cacheSizeMemory = 4*1024*1024; // 4MB
let cacheSizeDisk = 32*1024*1024; // 32MB
let sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "nsurlcache")
NSURLCache.setSharedURLCache(sharedCache)
1
sebspi

Je charge des pages html à partir de Documents et s’ils portent le même nom que le fichier css UIWebView, il semble que cela ne jette pas les règles css précédentes. Peut-être parce qu'ils ont la même URL ou quelque chose.

J'ai essayé ceci:

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! Frustrant!

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

Update1: J'ai trouvé ceci .
Changer les fichiers html, bien que cela semble très compliqué.

0
Evgeni Petrov