Ist es möglich, eine NSURLRequest von Caching von Daten zu verhindern oder im Cache gespeicherten Daten löschen nach einer Anfrage?

StackOverflow https://stackoverflow.com/questions/405151

  •  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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top