ios - pasa - Borrar el caché UIWebView cuando use el archivo de imagen local
que pasa si borro los datos de facebook (3)
Utilizo un UIWebView para cargar un html local, y hay un archivo PNG dentro del html creado por Objc.
Después de que se haya modificado el archivo PNG, recargo el html en UIWebView, pero la imagen no cambia. Sin embargo, si salgo de la aplicación y la vuelvo a abrir, el archivo de imagen se cambiará al nuevo.
He comprobado el archivo PNG en Documentos con Finder, por lo que estoy seguro de que se ha modificado, pero el anterior todavía está en UIWebView.
Entonces, como creo que es un problema de caché de UIWebView, lo intenté:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:url isDirectory:NO ] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:1]];
oNSURLRequestReloadIgnoringCacheData
Ninguno de ellos funciona, y no puedo cambiar el nombre del archivo, porque el archivo PNG se usa en muchos lugares (otros códigos html y objc).
He intentado esto también: some.png?r=randomNumber
pero no se puede mostrar.
¿Cómo borro el caché de UIWebView cuando uso un archivo de imagen local dentro de un html local?
Aparte de cambiar el nombre de cada archivo en cada acceso, solo he visto una cosa que funciona para esto y que está modificando el HTML con javascript para agregar una marca de tiempo en la url de la imagen, de modo que engaña a la vista web y le hace pensar que es un archivo diferente. Las imágenes (generalmente) cargan lo mismo sin importar lo que pones después de? en su url. Creo que esto sería más fácil que cambiar el nombre de cada archivo cada vez que cargue la vista web. Algo así (usando jQuery):
<img src="myimg.jpg" />
<script>
$(function() {
$(''img'').each(function(i, el) {
$(el).attr(''src'', $(el).attr(''src'')+''?pizza=''+(new Date()).getTime());
});
});
</script>
Supongo que esto supone que este javascript se carga y se ejecuta antes de que se carguen las imágenes, pero en teoría esto debería funcionar.
Para un poco de historia, hice una página en una vista web que usa RequireJS para cargar asincrónicamente bastantes archivos. Tuve el EXACTAMENTE el mismo problema del que habla esta pregunta, excepto que estaba cargando archivos de JavaScript en lugar de imágenes. La clave para solucionar este problema fue agregar una marca de tiempo en cada ruta del archivo javascript y, por lo tanto, engañar a la vista web (ex me.js? Ts = 236136236 y whatever.js? Ts = 3153524623). Encontré que esto funciona bien.
Otra cosa que tenía que hacer era agregar una marca de tiempo a la ruta de mi archivo HTML al cargarlo en la vista web de esta manera:
[NSURL URLWithString:[[NSString stringWithFormat:@"%@/index.html?pizza=%f", webDirectoryPath, [[NSDate date] timeIntervalSince1970]]
Ahora puedo modificar todos los archivos locales y cada vez que aparece la vista web aparecen los cambios.
Puede probar esto en su AppDelegate.m
+(void)initialize {
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
}
Si su html no cambió y el único cambio fue en la imagen, debería usar el mensaje de reload
UIWebView
lugar de cargar la solicitud nuevamente.
Algo como esto:
- (void)reloadWebView:(id)sender
{
if (self.loaded) {
[self.webView reload];
} else {
NSString *html = [[NSBundle mainBundle] pathForResource:@"web" ofType:@"html"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:html]];
[self.webView loadRequest:request];
self.loaded = YES;
}
}
Ni siquiera necesitas manipulaciones con caché.