Effacer le cache UIWebview

J'ai utilisé UIWebview pour charger une page web en utilisant loadRequest: méthode, quand je quitte cette scène que j'appelle [self.webView stopLoading]; et libérez le webView.

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

J'ai vérifié le nombre de retenir de webview. Il est correct, par exemple, 0. Je pense que UIWebView met en cache certaines données. Comment éviter la caching ou supprimer datatables mises en cache? Ou y a-t-il une autre raison à cela?

Je pense réellement qu'il peut conserver des informations en cache lorsque vous fermez le UIWebView . J'ai essayé de supprimer un UIWebView de mon UIViewController , le libérant, puis en créant un nouveau. Le nouveau s'est souvenu exactement où j'étais quand je suis returnné à une adresse sans avoir à recharger tout (il se souvenait que mon précédent UIWebView était connecté).

Donc quelques suggestions:

 [[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest]; 

Cela supprimerait une réponse caching pour une request spécifique. Il y a également un appel qui supprimera toutes les réponses mises en cache pour toutes les requests exécutées sur l' UIWebView :

 [[NSURLCache sharedURLCache] removeAllCachedResponses]; 

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

 for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) { if([[cookie domain] isEqualToSsortingng:someNSSsortingngUrlDomain]) { [[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) } } 

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

Donc dans l' application:DidFinishLaunchingWithOptions: configure 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 avez besoin de purger le cache (par exemple dans applicationDidReceiveMemoryWarning ou lorsque vous fermez un UIWebView ), faites simplement:

 [[NSURLCache sharedURLCache] removeAllCachedResponses]; 

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

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

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

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) } } 

Ma supposition éclairée est que l'utilisation de la memory que vous voyez ne provient pas du contenu de la page, mais du chargement de UIWebView et de toutes les bibliothèques WebKit de support. J'adore le contrôle UIWebView, mais c'est un contrôle «lourd» qui intègre un très gros bloc de code.

Ce code est un grand sous-set du browser iOS Safari et initialise probablement un grand nombre de structures statiques.

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

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

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

Les caches spécifiques aux applications sont stockés dans ~/Library/Caches/<bundle-identifier-of-your-app> , donc supprimez simplement comme ci-dessous et rouvrez votre application

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

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) 

Je charge des pages html à partir de Documents et si elles ont le même nom que le file css UIWebView il semble qu'il ne lance 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é ça .
Changer les files html, mais semble très désordonné.