3 Stimmen

iPhone - Prüfen, ob Datei aktualisiert werden muss / Update

Ich versuche, eine einfache Anwendung zu erstellen, die prüft, ob eine .txt-Datei auf dem iPhone aktualisiert werden muss. Im Moment überprüfe ich den html-Header der letzten Änderung und möchte diesen mit der Datei auf meinem iPhone vergleichen. Wenn das Datum auf der Website später ist als die Datei auf dem iPhone, lädt das iPhone die Datei herunter und ersetzt sie.

Ich verwende NSURL und habe ziemliche Schwierigkeiten beim Herunterladen der Datei.

Vielen Dank im Voraus

0 Stimmen

Mit welchem Teil haben Sie Probleme? Welche Teile funktionieren?

0 Stimmen

Ich bin in der Lage, die Zeichenfolge aus der lastModified-Header von der Website zu bekommen, aber ich bin sehr unsicher, wie man diese mit der Datei innerhalb des iPhone (.txt-Datei) zu vergleichen.

6voto

ASIHTTPRequest ist eine Bibliothek, die HTTP-Anfragen und eine Reihe von intuitiven Prüfungen (wie Proxy-Authentifizierung, Caching usw.) in einer Klasse kapselt, die eine Erweiterung von NSURLRequest . Ich empfehle die Verwendung dieser Option. Sie können eine Caching-Richtlinie aus den möglichen Optionen auswählen aquí . Es sieht so aus, als wollten Sie ASIAskServerIfModifiedCachePolicy das immer den Server fragt, ob es eine neuere Version gibt und nur dann herunterlädt, wenn es eine neuere Version gibt (es prüft Last-Modified: sowie andere Kopfzeilen). Sie können diese Caching-Richtlinie auch kombinieren mit ASIFallbackToCacheIfLoadFailsCachePolicy so dass im Falle einer fehlgeschlagenen Kontaktaufnahme mit dem Server die zuletzt gespeicherte Version weiter verwendet wird.

Beispiel-Code:

#import "ASIHTTPRequest.h"
#import "ASIDownloadCache.h"

/* doing the actual check. replace your existing code with this. */
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:myTxtFileURL];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request startSynchronous];
NSString *latestText = [request responseString];
[request release];

Beachten Sie, dass ich nur [request startSynchronous] weil es einfach ist, einen Beispielcode einzufügen. Sie sollten verwenden:

  1. [request setDelegate:self] und implementieren dann die ASIHTTPRequestDelegate Protokoll in der aktuellen Klasse irgendwo zu behandeln requestFinished: y requestFailed: , oder
  2. Ein Block, den Sie mit

    [request setCompletionBlock:^
    {
        /* code to run after the download finishes */
    }];
    [request setFailedBlock:^
    {
        /* code to run if the download failed */
    }];

Beides muss geschehen, bevor [request startSynchronous] und dann müssen Sie die startSynchronous a startAsynchronous . Unter diesem Link finden Sie weitere Informationen über die " Wie man es benutzt Registerkarte ".

Editar: Sie sagen, Sie wollen die Dateien selbst vergleichen. Ich weiß nicht genau, was Sie wollen, aber wenn Sie den Inhalt der alten Datei mit dem Inhalt der neuen Datei vergleichen wollen, müssen Sie zunächst eine Kopie des Textes der alten Datei erstellen. Um dies zu tun:

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:myTxtFileURL];
[request setDownloadCache:[ASIDownloadCache sharedCache]];
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
NSStringEncoding encoding;
NSError *error = nil;
NSString *oldText =
[NSString stringWithContentsOfFile:[[ASIDownloadCache sharedCache] pathToCachedResponseDataForRequest:request]
                      usedEncoding:encoding
                             error:&error];
[request startSynchronous];
NSString *newText = [request responseString];
[request release];

/* now compare the NSString oldText to newText however you like. */

Um ein guter Programmierer zu werden, muss man in der Lage sein, die verfügbare Dokumentation und Ressourcen zu nutzen und zu erforschen. Ich schlage vor, dass Sie die Dokumentation, auf die ich verlinkt habe, lesen, die Dokumentation von Apple zu iOS lesen oder eine Google-Suche für Ihre nächste Frage durchführen. Der Abschnitt über den Vergleich von Zeichenketten in der Dokumentation von Apple lautet aquí .

0 Stimmen

Danke, Darvidson, ich werde versuchen, ASI zu überprüfen; aber wie würde ich die Daten der physischen Datei auf dem iPhone überprüfen?

0 Stimmen

Die alte Version wird in einem Cache-Verzeichnis aufbewahrt, und jedes Mal, wenn im Web nach der Datei gesucht wird, wird das Datum der letzten Änderung in den Kopfzeilen mit dem Änderungsdatum der Datei im Cache-Verzeichnis verglichen. Im Grunde übernimmt es also die Überprüfung für Sie :) Wenn Sie die Datei Text21032011 oder so nennen, würde ich, damit es richtig funktioniert, das Datum entfernen, damit jede Version den gleichen Namen hat. Auf diese Weise wird die Prüfung für Sie durchgeführt.

0 Stimmen

Nein, [request startSynchronous] startet und beendet den Download, die latestText-Zeichenkette ist der Inhalt der Textdatei, der Download ist also bereits abgeschlossen.

0voto

Caleb Punkte 121906

Eine Option ist das bedingte Laden der Datei vom Server mit Hilfe der HTTP-Funktion ETag-Header . Sie müssen sich den ETag-Wert von der letzten Aktualisierung der Datei merken, aber das ist nicht schwer. Außerdem benötigen Sie einen Server, der für die Verwendung von ETags konfiguriert ist; auch das ist nicht schwierig, es sei denn, der Server entzieht sich völlig Ihrer Kontrolle.

0voto

kraj Punkte 1

Sie können diese Tags mit Ihrer asihttprequest verwenden

[request setDownloadCache:[ASIDownloadCache sharedCache]]; [request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy]; [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; [request addRequestHeader:@"Cache-Contro" value:@"no-cache"];

und überprüfen Sie dann in Ihrem Abschlussblock "[request responseStatusMessage]" Wenn diese Zeichenfolge 304 enthält, bedeutet dies, dass Ihre Antwort nicht geändert wurde, ansonsten enthält die Zeichenfolge 200, was bedeutet, dass einige neue Dinge in Ihrer Antwort verfügbar sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X