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!

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.


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;
}

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" ...


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.