È ansible impedire a NSURLRequest di memorizzare nella cache i dati o rimuovere i dati memorizzati dopo una richiesta?

Su iPhone, eseguo una richiesta HTTP usando NSURLRequest per una porzione di dati. I picchi di allocazione degli oggetti e io assegniamo i dati di conseguenza. Quando ho finito con i dati, li ho liberati di conseguenza – tuttavia gli strumenti non mostrano alcun dato da liberare!

La mia teoria è che per impostazione predefinita le richieste HTTP sono memorizzate nella cache, tuttavia – Non voglio che la mia app per iPhone memorizzi questi dati.

C’è un modo per cancellare questa cache dopo una richiesta o impedire che i dati vengano memorizzati nella cache in primo luogo?

Ho provato a utilizzare tutte le politiche della cache documentate un po ‘come qui sotto:

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 

ma nulla sembra liberare la memoria!

Di solito è più facile creare la richiesta in questo modo

 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; 

Quindi creare la connessione

 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; 

e implementare la connessione: willCacheResponse: metodo sul delegato. Il solo ritorno di nil dovrebbe farlo.

 - (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return nil; } 

Ho lo stesso problema nella mia app quando ho richiesto informazioni da Twitter. Nel mio caso non ho avuto bisogno di conservare quelle credenziali, quindi le cancello semplicemente usando il prossimo codice:

 - (void) eraseCredentials{ NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage]; NSDictionary *allCredentials = [credentialsStorage allCredentials]; //iterate through all credentials to find the twitter host for (NSURLProtectionSpace *protectionSpace in allCredentials) if ([[protectionSpace host] isEqualToString:@"twitter.com"]){ //to get the twitter's credentials NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace]; //iterate through twitter's credentials, and erase them all for (NSString *credentialKey in credentials) [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace]; } } 

Spero che funzioni per qualcuno 🙂

Se usi NSURLConnection dai un’occhiata al delegato:

 - (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse 

Valore di ritorno

La risposta effettiva memorizzata nella cache per l’archiviazione nella cache. Il delegato può restituire cachedResponse unmodified, restituire una risposta memorizzata nella cache o restituire nil se non si desidera memorizzare alcuna risposta memorizzata nella cache per la connessione.

Se non specifico per una singola richiesta (U vuoi disabilitare la cache per l’intera app) sotto uno è l’opzione migliore.Aggiungere questo codice nel delegato dell’app o in base al bisogno di qualsiasi dove

  int cacheSizeMemory = 0*4*1024*1024; // 0MB int cacheSizeDisk = 0*32*1024*1024; // 0MB NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; [NSURLCache setSharedURLCache:sharedCache]; 

Se si utilizza NSURLSession , un’altra soluzione per impedire la scrittura di richieste e parametri nella Cache.db iOS all’interno della directory Cache.db dell’applicazione, è impostare NSURLCache per la configurazione della sessione su una memoria di dimensione 0 e una cache del disco di dimensione 0 ad es.

 let configuration = URLSessionConfiguration.default configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) let session = URLSession(configuration: configuration) 

o come detto sopra impostato a livello di cache globale

 URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) 

Presumibilmente è lo 0 per la dimensione del disco che interrompe la scrittura su disco da parte di iOS, ma se hai una politica per reloadIgnoringLocalCacheData allora probabilmente non sei interessato nemmeno al caching della memoria.

Nota Questo impedirà la Caches/Cache.db (richieste e risposte) o Caches/fsCachedData/ cartella (dati di risposta). Abbiamo deciso di adottare questo approccio in un’app per motivi di sicurezza, in quanto non vogliamo che le nostre richieste vengano archiviate nella cache del disco.

Se qualcuno sa che esiste un modo per interrompere la richiesta di memorizzazione nella cache ma mantenere la cache dei dati di risposta dal meccanismo di caricamento degli URL iOS, sarei interessato a sapere. (Non ci sono API o documentazione ufficiale su questo da quello che posso dire)

 NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url]; [request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 

Supponendo che il server sia implementato correttamente, inserendo Cache-Control:no-store intestazione Cache-Control:no-store nella richiesta genererà una risposta del server con la stessa intestazione, causando così che NSURLCache non memorizzi i dati di risposta sul disco.

Pertanto, non è necessario l’approccio shotgun per disabilitare la memorizzazione nella cache del disco di NSURLCache .

PS: l’aggiunta dell’intestazione dovrebbe funzionare per tutti i framework HTTP, come AFNetworking