2013-10-01 11 views
14

Sto visualizzando un'app Web in un UIWebView e talvolta il contenuto delle pagine cambierà. Dopo che il contenuto è stato modificato, l'app cancella la cache. Ma quando vado a una pagina Ho già visitato il UIWebView non invia una richiesta GET HTTP, ma i carichi dalla cache anche se ho disabilitato la cache in questo modo:Rimuovere la cache interna di UIWebView

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 
[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 

Inizialmente sto caricando un richiesta con cachePolicy cachePolicy:NSURLRequestReturnCacheDataElseLoad.

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:myURLString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]]; 

UIWebView avere una sorta di cache interna. Le pagine già visitate verranno caricate da questa cache interna invece di passare attraverso NSURLCache e inoltre non è stata inviata alcuna richiesta.

C'è un modo per svuotare la cache interna di UIWebView? Sto anche ricreando lo UIWebView ma la cache è ancora lì.

+0

Avete provato la soluzione qui: http://stackoverflow.com/a/14096331/1749367 – helper

+0

Sì, nessun successo con nessuna di queste soluzioni funziona per quello che voglio realizzare. –

+0

Ho trovato una soluzione alternativa: impostare l'attributo Cache-Control nell'intestazione della risposta HTTP su max-age = 0. Quindi una richiesta verrà inviata per la risorsa ogni volta. Un modo per risolverlo potrebbe essere quello di tenere traccia di se un file è stato richiesto prima dall'ultima eliminazione della cache, e impostare max-age su un altro valore (ad es. 3600) la seconda volta che una risorsa viene caricata dopo l'ultima eliminazione. –

risposta

21

Sembra che quello che sta accadendo qui è che ricarica il vero file HTML, ma non necessariamente ricarica le risorse all'interno di quella pagina.

Una possibile soluzione che ho visto è di aggiungere un parametro di query alla fine dell'URL. Per esempio:

NSString *testURL = [NSString stringWithFormat:@"%@?t=%@", url, randQuery]; 
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:testURL] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0]]; 

in cui si genera un random alphanumeric string come parametro di query randQuery, o di tenere un conteggio persistente e solo contare su.

Questo dovrebbe forzare UIWebView a caricare dalla risorsa remota.

+0

Non voglio disabilitare completamente la memorizzazione nella cache. Spiacente, il mio uso di NSURLRequestReloadIgnoringLocalAndRemoteCacheData è confuso. Aggiornerà la domanda Effettivamente utilizzando cachePolicy: NSURLRequestReturnCacheDataElseLoad.Vuoi che venga memorizzato nella cache fino alla cancellazione della cache. –

+0

Quindi sembra che dovrai semplicemente usare il lato server, potresti usare le richieste AJAX o Web Sockets quando il contenuto cambia piuttosto che provare ad aggiornare la pagina. Potrebbe funzionare nella tua situazione? –

+0

Buona idea, ma non adatta nel mio caso. Un'altra azienda ha creato l'app Web. Posso comunque modificarlo, ma l'app Web è già stata creata. –

7

Ho avuto lo stesso problema e l'impostazione della proprietà HTTPShouldHandleCookies su NO ha risolto il problema.

Ad esempio:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strurl]]; 

[request setHTTPShouldHandleCookies:NO]; 

[webView loadRequest: request]; 

Spero che questo aiuto.

+0

Non ha funzionato per me, sto accedendo ai file locali, non attraverso la rete. Grazie comunque :) –