2010-01-13 9 views
34

Ich möchte eine Python-App portieren, die Mechanize für das iPhone verwendet. Diese App muss sich auf einer Webseite anmelden und das Cookie der Seite verwenden, um zu anderen Seiten auf dieser Seite zu gelangen, um einige Daten zu erhalten.HTTP-Cookies auf dem iPhone verwalten

Mit meiner Python-App verwendete ich Mechanize für die automatische Cookie-Verwaltung. Gibt es für Objective C etwas Ähnliches, das auf das iPhone übertragbar ist?

Danke für jede Hilfe.

+1

A * Python * -App? 'WWW :: Mechanize' ist eine Perl-Bibliothek. –

+3

Es gibt auch einen Python-Port. http://www.search.sourceforge.net/mechanize/ – dan

Antwort

72

NSURLConnection gibt Ihnen die Cookie-Verwaltung kostenlos. Von der URL Loading System Programming Guide:

Das URL-Ladesystem sendet automatisch alle gespeicherten Cookies für eine NSURLRequest. es sei denn, die Anfrage gibt an, keine Cookies zu senden. Ebenso werden Cookies, die in einer NSURLResponse zurückgegeben werden, gemäß der aktuellen Cookie-Akzeptanzrichtlinie akzeptiert.

+4

+1 Dies sollte die richtige Antwort sein. –

+0

Wie überprüfe ich, ob ein NSURLRequest mit Cookies sendet? Wie logge ich es an die Konsole? – trillions

+3

Siehe '- [NSHTTPCookieStorage cookiesForURL:]'. –

43

Mithilfe der NSURLConnection-Klasse können Sie eine HTTP-Anforderung zum Anmelden der Website und zum Abrufen des Cookies ausführen. Um eine Anfrage auszuführen, erstellen Sie einfach eine Instanz von NSURLConnection und weisen Sie ihr ein Delegate-Objekt zu.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

Implementieren Sie eine Delegate-Methode.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response; 
    NSDictionary *fields = [HTTPResponse allHeaderFields]; 
    NSString *cookie = [fields valueForKey:@"Set-Cookie"]; // It is your cookie 
} 

Behalten oder kopieren Sie die Cookie-Zeichenfolge. Wenn Sie eine weitere Anfrage ausführen möchten, fügen Sie sie Ihrem HTTP-Header Ihrer NSURLRequest-Instanz hinzu.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
[request addValue:cookie forHTTPHeaderField:@"Cookie"]; 
+26

Sie müssen dies nicht tun, speichert NSURLConnection automatisch und sendet Cookies, es sei denn, Sie sagen es ausdrücklich nicht. – benzado

+1

Auch wenn dies nicht notwendig sein sollte behoben einen vermuteten Fehler in iOS 4.2GM –

+0

Wie würde man feststellen, dass eine Sitzung clientseitig abgelaufen ist? Welchen Rückruf sollten wir erwarten? Oder ist es nur eine Frage der Überprüfung, ob die Anfrage (mit dieser Sitzungs-ID) erfolgreich war oder nicht? – Cole

0

@ zonbles Antwort funktioniert nur in meinem localhost; Wenn der Server nicht lokal ausgeführt wird, fehlt der Header "Set-Cookie" im Feld NSDictionary * fields = [HTTPResponse allHeaderFields];

Endlich fand ich @ Benzdos Lösung funktioniert gut. Siehe auch: iphone nsurlconnection read cookies @Tal Bereznitskey die Antwort.