ios - para - Borrar el caché de UIWebview
eliminar cache y cookies de chrome (9)
De hecho, creo que puede retener la información en caché cuando cierras UIWebView
. Intenté eliminar un UIWebView
de mi UIViewController
, liberándolo y luego creando uno nuevo. El nuevo recordaba exactamente dónde estaba cuando volví a una dirección sin tener que volver a cargar todo (recordaba que mi UIWebView
anterior había UIWebView
).
Entonces un par de sugerencias:
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];
Esto eliminaría una respuesta en caché para una solicitud específica. También hay una llamada que eliminará todas las respuestas en caché para todas las solicitudes ejecutadas en UIWebView
:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
Después de eso, puede intentar eliminar cualquier cookie asociada con 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)
}
}
He usado UIWebview para cargar una página web utilizando el método loadRequest:
cuando salgo de esa escena, llamo a [self.webView stopLoading];
y libera la vista web.
En el monitor de actividad en el primer lanzamiento, he visto que la memoria real aumentó en 4 MB, y en múltiples lanzamientos / carga la memoria real no aumenta. Está aumentando solo una vez.
Revisé el conteo retenido de la vista web. Es correcto, es decir, 0. Creo que UIWebView está almacenando en caché algunos datos. ¿Cómo evito almacenar en caché o eliminar datos en caché? ¿O hay otra razón para esto?
Después de varios intentos, solo esto funciona bien para mí (bajo ios 8):
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
[NSURLCache setSharedURLCache:cache];
Estoy cargando páginas html desde Documentos y si tienen el mismo nombre del archivo css UIWebView
, parece que no arroja las reglas CSS anteriores. Tal vez porque tienen la misma URL o algo así.
Intenté esto:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
Intenté esto:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
Estoy cargando la página inicial con:
NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
¡Se niega a lanzar sus datos en caché! ¡Frustrante!
Estoy haciendo esto dentro de una aplicación PhoneGap (Cordova). No lo he probado en UIWebView aislado.
Actualización1: he encontrado this .
Cambiar los archivos html, aunque parece muy complicado.
Mi conjetura es que el uso de la memoria que está viendo no proviene del contenido de la página, sino de cargar UIWebView y todas las bibliotecas de WebKit compatibles. Me encanta el control UIWebView, pero es un control "pesado" que atrapa un bloque de código muy grande.
Este código es un gran subconjunto del navegador Safari de iOS, y probablemente inicialice un gran cuerpo de estructuras estáticas.
No deshabilite el almacenamiento en caché por completo, dañará el rendimiento de su aplicación y no es necesario. Lo importante es configurar explícitamente la caché al inicio de la aplicación y purgarla cuando sea necesario.
Entonces en la application:DidFinishLaunchingWithOptions:
configure los límites de caché de la siguiente manera:
- (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
}
Una vez que lo haya configurado correctamente, cuando necesite purgar el caché (por ejemplo, en applicationDidReceiveMemoryWarning
o cuando cierre un UIWebView
) simplemente haga lo siguiente:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
y verá que la memoria está recuperada. Publiqué sobre este tema aquí: http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/
No pude cambiar el código, por lo que necesitaba una línea de comando para fines de prueba y pensé que esto podría ayudar a alguien:
Los cachés específicos de aplicaciones se almacenan en ~/Library/Caches/<bundle-identifier-of-your-app>
, así que simplemente elimine como se muestra a continuación y vuelva a abrir su aplicación
rm -rf ~/Library/Caches/com.mycompany.appname/
Para 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)
Puede desactivar el almacenamiento en caché haciendo lo siguiente:
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)
}
}