Wo werden die Cookies eines UIWebView gespeichert?

97

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

Vielen Dank!

Punkt
quelle

Antworten:

171

Ihre Anwendung hat eine eigene "Keksdose" im [NSHTTPCookieStorage sharedHTTPCookieStorage]Behälter.

So können Sie einen kurzen Blick auf die Cookies im Cookie-Glas Ihrer Anwendung werfen:

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

Zum Filtern und Bearbeiten stehen verschiedene Methoden zur Verfügung. Sehen Sie sich die NSHTTPCookieStorage- Dokumentation für den Zugriff auf Cookies und die NSHTTPCookie- Dokumentation für den Zugriff auf einzelne Cookie-Eigenschaften an.

Alex Reynolds
quelle
1
Das ist interessant. Ich wusste nicht, dass so etwas existiert. Vielen Dank für den Hinweis.
Brad Larson
Danke, Alex! Genau das, wonach ich gesucht habe.
Punkt
Das ist großartig! Wie protokolliere ich ein bestimmtes Cookie für einen bestimmten Server?
Lior Frenkel
Um Cookies für einen bestimmten Server zu erhalten, verwenden Sie die cookiesForURLMethode anstelle voncookies
gyimi
3
Diese Methode funktioniert nicht wirklich, da dadurch nur die Cookies gelöscht werden, bis Sie die App beenden. Aber wenn Sie es wieder öffnen, sind Cookies immer noch da.
Felipe Brahm
21

Danke für den Zeiger Alex! Um dies hinzuzufügen, werde ich meinen "Cookie Dumper" einfügen, den ich anhand von 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;
}
Bladnman
quelle
Sie können dies sogar als zu erweiternde Kategorie hinzufügen NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds
+1 zum Herausziehen der Logik, wie ein Cookie in einer separaten Methode angezeigt wird! Selbst für so ein kleines Snippet hilft es !!
Guven
Danke dir! Es gibt einen Tippfehler: [Cookie-Version] ist NSUInteger, daher sollte% d verwendet werden.
Pavel Alexeev
3

Alex hatte eine großartige Idee, dies in eine Kategorie einzuteilen. Folgendes habe ich letztendlich verwendet:

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 etwas "JSON-y" ...

DarkestOne
quelle
1

in sandbox:Library->Cookies->Cookies.binarycookies aber Sie können das .binarycookies nicht direkt öffnen , Sie können ein Skript ausführen:

  1. Laden Sie Python herunter und installieren Sie es

  2. Laden Sie BinaryCookieReader.py herunter

  3. Führen Sie "Python BinaryCookieReader.py" auf dem Terminal aus

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, enthält das Ausgabeprotokoll eine detaillierte Beschreibung der Cookies

xy z
quelle