Löschen des UIWebview-Cache


68

Ich habe UIWebview verwendet, um eine Webseite mithilfe der loadRequest:Methode zu laden. Wenn ich diese Szene verlasse, rufe ich [self.webView stopLoading];die WebView auf und gebe sie frei.

Im Aktivitätsmonitor beim ersten Start habe ich gesehen, dass der reale Speicher um 4 MB erhöht wurde und beim mehrfachen Starten / Laden der reale Speicher nicht zunimmt. Es nimmt nur einmal zu.

Ich habe die Anzahl der Webviews überprüft. Es ist richtig, dh 0. Ich denke, UIWebView speichert einige Daten zwischen. Wie vermeide ich das Zwischenspeichern oder entferne zwischengespeicherte Daten? Oder gibt es dafür einen anderen Grund?

Antworten:


127

Ich denke tatsächlich, dass es zwischengespeicherte Informationen behalten kann, wenn Sie das schließen UIWebView. Ich habe versucht, ein UIWebViewaus meinem zu entfernen UIViewController, es freizugeben und dann ein neues zu erstellen. Der Neue erinnerte sich genau daran, wo ich mich befand, als ich zu einer Adresse zurückkehrte, ohne alles neu laden zu müssen (er erinnerte sich, dass mein Vorgänger UIWebViewangemeldet war).

Also ein paar Vorschläge:

[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];

Dies würde eine zwischengespeicherte Antwort für eine bestimmte Anforderung entfernen. Es gibt auch einen Aufruf, der alle zwischengespeicherten Antworten für alle Anforderungen entfernt, die ausgeführt werden auf UIWebView:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

Danach können Sie versuchen, alle zugehörigen Cookies zu löschen mit 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)
    }
}

Und was ist mit loadHTMLString: baseURL :? Es scheint nicht zu funktionieren, wenn ich Cookies und URL-Cache lösche ...
nverinaud

9
Hallo, ich habe versucht [[NSURLCache sharedURLCache] removeAllCachedResponses];, aber es funktioniert nicht, ich habe immer noch das gleiche Bild im Cache ... Gibt es eine andere Problemumgehung?
Arlg

3
Ja, hier bekomme ich eine dauerhafte Anmeldung und ich denke, dass UIWebView das Token möglicherweise zu lange hält. Irgendwelche Gedanken?
Ethan Parker

1
Funktioniert dies in iOS 7, weil ich in den letzten Tagen mit demselben Problem festgefahren bin und den obigen Code verwendet habe, aber nichts passiert. Ich sehe immer noch die zwischengespeicherten Seiten in meiner Webansicht. Irgendwelche Vorschläge zu diesem @groomsy
user2538944

1
Das Löschen des NSURLCache hat mir mit iOS7 nicht geholfen, aber ich habe eine hackige Problemumgehung mit NSURLProtocol. stackoverflow.com/a/26408420/449161
Ben Flynn

45

Deaktivieren Sie das Caching nicht vollständig, da dies die Leistung Ihrer App beeinträchtigt und unnötig ist. Wichtig ist, dass Sie den Cache beim Start der App explizit konfigurieren und bei Bedarf löschen.

So in application:DidFinishLaunchingWithOptions:configure die Cache - Grenzen wie folgt:

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

Sobald Sie es richtig konfiguriert haben, tun Sie Folgendes, wenn Sie den Cache leeren müssen (z. B. in applicationDidReceiveMemoryWarningoder wenn Sie a schließen UIWebView):

[[NSURLCache sharedURLCache] removeAllCachedResponses];

und Sie werden sehen, dass der Speicher wiederhergestellt ist. Ich habe hier über dieses Problem gebloggt: http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/


Auch mehr Pluspunkte, wenn ich könnte. Ich denke, das hat die Leistung gesteigert UND mein überaggressives Caching-Problem gelöst.
Erik Reppen

10

Sie können das Caching wie folgt deaktivieren:

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

BOGEN:

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

In meinem Fall brauchte ich überhaupt kein Caching, daher war diese Antwort für mich sehr hilfreich. Für andere, die diese Richtung wählen: Diese Zeilen werden auch in didFinishLaunchingWithOptions platziert. Die letzte Zeile (SharedCache-Version) sollte in neueren Anwendungen weggelassen werden, da ARC dies jetzt für Sie erledigt.
Isilher

6

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

Dies ist besser als Bearbeitung einer anderen Antwort, da es sich nur um eine andere Sprache für eine Frage handelt, in der keine Sprache angegeben ist.
Peter DeWeese

Funktioniert perfekt zum Löschen der Cache-Sitzung, wenn Sie API + Token und Webview + Authentifizierung in derselben App verwenden!
Pelanes

2

Ich gehe davon aus, dass die angezeigte Speichernutzung nicht vom Seiteninhalt abhängt, sondern vom Laden von UIWebView und allen unterstützenden WebKit-Bibliotheken. Ich liebe das UIWebView-Steuerelement, aber es ist ein "schweres" Steuerelement, das einen sehr großen Codeblock abruft.

Dieser Code ist eine große Teilmenge des iOS Safari-Browsers und initialisiert wahrscheinlich eine große Anzahl statischer Strukturen.


Aber wenn ich die Webansicht freigebe, wird angenommen, dass auch der zwischengespeicherte Inhalt freigegeben wird ... Aber es wird nicht der zwischengespeicherte Inhalt freigegeben ... So entfernen Sie die zwischengespeicherten Daten
Chandan Shetty SP

Wenn Sie Ihren ursprünglichen Beitrag lesen, ist das Symptom, dass Ihre Speichernutzung zunimmt, aber dann nicht abfällt, wenn Sie UIWebView nicht mehr verwenden. Mein Vorschlag ist, dass die Speichernutzung NICHT den Inhalt zwischenspeichert, sondern die von UIWebView geladenen Code- und Datenstrukturen. Überprüfen Sie, ob Sie das UIWebView-Steuerelement freigegeben haben, nicht nur den von Ihnen angezeigten Webinhalt.
Chris Hawkins

2

Ich konnte den Code nicht ändern, daher brauchte ich zu Testzwecken eine Befehlszeile und dachte, dies könnte jemandem helfen:

Anwendungsspezifische Caches werden in gespeichert. ~/Library/Caches/<bundle-identifier-of-your-app>Entfernen Sie sie einfach wie folgt und öffnen Sie Ihre Anwendung erneut

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


1

Nach verschiedenen Versuchen funktioniert nur dies gut für mich (unter ios 8):

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

1

Für schnelle 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)

Was nützt es, hier den separaten NSURLCache einzustellen
RajuBhai Rocker

0

Ich lade HTML-Seiten aus Dokumenten und wenn sie den gleichen Namen wie eine CSS-Datei UIWebViewhaben, werden anscheinend die vorherigen CSS-Regeln nicht ausgelöst. Vielleicht, weil sie die gleiche URL haben oder so.

Ich habe es versucht:

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

Ich habe es versucht:

[[NSURLCache sharedURLCache] removeAllCachedResponses];

Ich lade die Startseite mit:

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

Es weigert sich, seine zwischengespeicherten Daten zu werfen! Frustrierend!

Ich mache dies in einer PhoneGap (Cordova) -Anwendung. Ich habe es nicht in isoliertem UIWebView versucht.

Update1: Ich habe festgestellt , diese .
Das Ändern der HTML-Dateien scheint jedoch sehr chaotisch.


Update2: Ich habe es geschafft, damit umzugehen. Gleich nach einer neuen Anfrage lade ich auch die Webansicht neu. Aus irgendeinem Grund wird das CSS korrekt geladen.
Evgeni Petrov

Hey, ich weiß, das ist alt, aber was meinst du damit, die Webansicht neu zu laden? Das Aufrufen von [webview reload] scheint nichts zu bewirken, und ich bin an der gleichen Position wie Sie, habe alles versucht und möchte nicht jedem Skript und jeder CSS-URL eine zufällige Zeichenfolge hinzufügen.
Benutzer1234

Das war 2012 auf iOS6, wahrscheinlich funktioniert der Hack nicht mehr. Kurz nach dem Laden rief ich reload an. Das war's.
Evgeni Petrov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.