Ist es möglich, eine NSURLRequest von Caching von Daten zu verhindern oder im Cache gespeicherten Daten löschen nach einer Anfrage?
-
03-07-2019 - |
Frage
Auf dem iPhone, führe ich eine HTTP-Anforderung mit NSURLRequest für einen Teil der Daten. Objektzuordnung Spikes und ich ordnen Sie die Daten entsprechend. Als ich mit den Daten fertig ist, ich es oben freizugeben entsprechend - jedoch Instrumente zeigen keine Daten befreit worden sein
!Meine Theorie ist, dass standardmäßig HTTP-Anforderungen zwischengespeichert werden, aber - ich will nicht mein iPhone App diese Daten zwischenzuspeichern.
Gibt es eine Möglichkeit, diese Cache nach einer Anforderung zu löschen oder alle Daten zu verhindern, dass an erster Stelle im Cache gespeichert werden?
Ich habe versucht, alle Cache-Regeln dokumentiert mit ein wenig wie folgt:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
, aber nichts scheint zu den Speicher freizugeben!
Lösung
In der Regel ist es einfacher, die Anfrage wie diese erstellen
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0];
Dann die Verbindung erstellen
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
delegate:self];
und Umsetzung der Verbindung: willCacheResponse: Methode auf dem Delegierten. Nur null Rückkehr sollte es tun.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
return nil;
}
Andere Tipps
Ich habe das gleiche Problem in meiner app, wenn ich Informationen von Twitter angefordert. In meinem Fall habe ich brauche nicht diese Anmeldeinformationen zu erhalten, so einfach ich löschen Sie sie dann den nächsten Code verwendet:
- (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];
}
}
Ich hoffe, es funktioniert für jemanden:)
Wenn Sie NSURLConnection bei den Delegierten einen Blick:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
Rückgabewert
Die tatsächliche gecached Antwort im Cache zu speichern. Der Delegierte kann cachedResponse unmodifizierten zurückkehren, geben eine modifizierte gecached Antwort oder Rückkehr null, wenn keine zwischengespeicherte Antwort sollte für die Verbindung gespeichert werden.
Wenn nicht spezifisch für eine einzelne Anforderung (U deaktivieren Cache für ganze app) unten ist die beste option.Add dieser Code in AppDelegate oder basierend auf ur Notwendigkeit, wo jeder
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];
Wenn Sie NSURLSession
verwenden, eine andere Lösung Anforderung und Parameter zu verhindern, dass der Cache.db
geschrieben iOS erstellt innerhalb der Caches
Verzeichnisses der App ist die NSURLCache
für die Sitzung der Konfiguration in einen 0 Größe Speicher und 0 Größe einzustellen Festplatten-Cache zum Beispiel
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)
oder wie oben Satz auf globaler Cache-Ebene erwähnt
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
Vermutlich ist es die 0 für Festplattengröße, die iOS Schreiben auf die Festplatte stoppt, aber wenn Sie eine Politik haben, dann reloadIgnoringLocalCacheData
Sie sind wahrscheinlich in Speicher-Caching entweder nicht interessiert.
Hinweis Das verhindert Caches/Cache.db
(Anfragen und Antworten) oder Caches/fsCachedData/
Ordner (Antwortdaten) überhaupt geschaffen. Wir haben beschlossen, in einer App für Sicherheitszwecke, diesen Ansatz zu nehmen, wie wir jemals auf dem Datenträger-Cache gespeichert nicht unsere Wünsche werden möchten.
Wenn jemand weiß, ist es eine Möglichkeit, nur Anforderung Caching zu stoppen, aber Antwort Daten-Caching von dem iOS URL Lademechanismus zu halten, ich würde interessieren wissen. (Es gibt keine API oder offizielle Dokumentation darüber, was ich sagen kann)
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
Unter der Annahme, der Server korrekt implementiert ist, die Cache-Control:no-store
Header in der Anforderung setzt eine Server-Antwort mit dem gleichen Header erzeugen, wodurch NSURLCache
nicht auf dem Datenträger die Antwortdaten zu speichern.
Daher keine Notwendigkeit für die Schrotflinte Ansatz von NSURLCache
Disk-Caching deaktivieren.
PS: den Header Hinzufügen sollte für alle HTTP-Frameworks arbeiten, wie AFNetworking