2009-04-21 30 views
96

Ich baue eine iPhone App mit Cookies. Durch das Löschen von Cookies in den Safari-Einstellungen werden sie nicht gelöscht. Wo sind sie gespeichert? Ist es möglich, sie von einem anderen UIWebView zu lesen?Wo sind die Cookies eines UIWebView gespeichert?

Danke!

Antwort

168

Ihre Anwendung hat ihre eigene "Keksdose" im [NSHTTPCookieStorage sharedHTTPCookieStorage] Container.

Hier ist, wie Sie einen kurzen Blick auf die Cookies nehmen könnte in Keksdose Ihrer Anwendung:

NSHTTPCookie *cookie; 
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (cookie in [cookieJar cookies]) { 
    NSLog(@"%@", cookie); 
} 

sind mehrere Verfahren zur Filterung und Manipulation zur Verfügung. Sehen Sie sich die Dokumentation NSHTTPCookieStorage für den Zugriff auf Cookies und die Dokumentation NSHTTPCookie für den Zugriff auf einzelne Cookie-Eigenschaften an.

+1

Das ist interessant. Ich wusste nicht, dass so etwas existiert. Danke, dass du es aufgezeigt hast. –

+0

Danke, Alex! Genau das, was ich gesucht habe. – dot

+0

Das ist großartig! Wie protokolliere ich ein bestimmtes Cookie für einen bestimmten Server? –

20

Danke für den Zeiger Alex! Dazu füge ich meinen "Cookie Dumper" hinzu, den ich mit Alex 'Beispiel erstellt habe. Vielleicht hilft das jemand anderem.

- (void) dumpCookies:(NSString *)msgOrNil { 
NSMutableString *cookieDescs = [[[NSMutableString alloc] init] autorelease]; 
NSHTTPCookie *cookie; 
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (cookie in [cookieJar cookies]) { 
    [cookieDescs appendString:[self cookieDescription:cookie]]; 
} 
NSLog(@"------ [Cookie Dump: %@] ---------\n%@", msgOrNil, cookieDescs); 
NSLog(@"----------------------------------"); 
} 

- (NSString *) cookieDescription:(NSHTTPCookie *)cookie { 

NSMutableString *cDesc  = [[[NSMutableString alloc] init] autorelease]; 
[cDesc appendString:@"[NSHTTPCookie]\n"]; 
[cDesc appendFormat:@" name   = %@\n",   [[cookie name] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
[cDesc appendFormat:@" value   = %@\n",   [[cookie value] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
[cDesc appendFormat:@" domain   = %@\n",   [cookie domain]]; 
[cDesc appendFormat:@" path   = %@\n",   [cookie path]]; 
[cDesc appendFormat:@" expiresDate  = %@\n",   [cookie expiresDate]]; 
[cDesc appendFormat:@" sessionOnly  = %d\n",   [cookie isSessionOnly]]; 
[cDesc appendFormat:@" secure   = %d\n",   [cookie isSecure]]; 
[cDesc appendFormat:@" comment   = %@\n",   [cookie comment]]; 
[cDesc appendFormat:@" commentURL  = %@\n",   [cookie commentURL]]; 
[cDesc appendFormat:@" version   = %d\n",   [cookie version]]; 

// [cDesc appendFormat:@" portList  = %@\n",   [cookie portList]]; 
// [cDesc appendFormat:@" properties  = %@\n",   [cookie properties]]; 

return cDesc; 
} 
+0

Sie können dies sogar als eine Kategorie hinzufügen, um 'NSHTTPCookieStorage' zu ​​erweitern: http://macdevelopertips.com/objective-c/objective-c-categories.html –

+0

+1 für das Extrahieren der Logik, wie man ein Cookie in einem anzeigt getrennte Methode! Selbst für so einen kleinen Ausschnitt hilft es !! – Guven

+0

Danke! Es gibt einen Tippfehler: [Cookie-Version] ist NSUInteger, daher sollte% d verwendet werden. –

3

Alex hatte eine großartige Idee, dies in eine Kategorie einzuordnen. Hier ist, was ich am Ende mit:

NSHTTPCookieStorage + Info.h

#import <Foundation/Foundation.h> 

@interface NSHTTPCookieStorage (Info) 

+ (NSDictionary*) describeCookies; 
+ (NSDictionary *) describeCookie:(NSHTTPCookie *)cookie; 

@end 

NSHTTPCookieStorage.m

@implementation NSHTTPCookieStorage (Info) 

+ (NSDictionary*) describeCookies { 
    NSMutableDictionary *descriptions = [NSMutableDictionary new]; 

    [[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies] enumerateObjectsUsingBlock:^(NSHTTPCookie* obj, NSUInteger idx, BOOL *stop) { 
     [descriptions setObject:[[self class] describeCookie:obj] forKey:[[obj name] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    }]; 

    NSLog(@"Cookies:\n\n%@", descriptions); 
    return descriptions; 
} 

+ (NSDictionary *) describeCookie:(NSHTTPCookie *)cookie { 
    return @{@"value" : [[cookie value] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
     @"domain" : [cookie domain] ? [cookie domain] : @"n/a", 
     @"path" : [cookie path] ? [cookie path] : @"n/a", 
     @"expiresDate" : [cookie expiresDate] ? [cookie expiresDate] : @"n/a", 
     @"sessionOnly" : [cookie isSessionOnly] ? @1 : @0, 
     @"secure" : [cookie isSecure] ? @1 : @0, 
     @"comment" : [cookie comment] ? [cookie comment] : @"n/a", 
     @"commentURL" : [cookie commentURL] ? [cookie commentURL] : @"n/a", 
     @"version" : @([cookie version]) }; 

} 

@end 

macht die Ausgabe ein bisschen mehr "JSON-y" ...

Verwandte Themen