Gdzie są przechowywane pliki cookie UIWebView?


97

Tworzę aplikację na iPhone'a z ciasteczkami. Usunięcie plików cookies w ustawieniach Safari nie powoduje ich usunięcia. Gdzie są przechowywane? Czy można je odczytać z innego UIWebView?

Dzięki!

Odpowiedzi:


171

Twoja aplikacja ma swój własny „słoik z ciasteczkami” w [NSHTTPCookieStorage sharedHTTPCookieStorage]kontenerze.

Oto, jak możesz szybko przyjrzeć się plikom cookie w słoiku plików cookie aplikacji:

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

Dostępnych jest kilka metod filtrowania i manipulacji. Zapoznaj się z dokumentacją NSHTTPCookieStorage, aby uzyskać dostęp do plików cookie, i dokumentacją NSHTTPCookie, aby uzyskać dostęp do poszczególnych właściwości plików cookie.


1
To interesujące. Nie wiedziałem, że coś takiego istnieje. Dzięki za wskazanie tego.
Brad Larson

Dzięki, Alex! Dokładnie to, czego szukałem.
kropka

To wspaniale! Jak zarejestrować określony plik cookie dla określonego serwera?
Lior Frenkel

Aby uzyskać pliki cookie dla określonego serwera, użyj cookiesForURLmetody zamiastcookies
gyimi

3
Ta metoda tak naprawdę nie działa, ponieważ spowoduje to usunięcie plików cookie tylko do momentu zamknięcia aplikacji. Ale po ponownym otwarciu ciasteczka nadal tam będą.
Felipe Brahm

21

Dzięki za wskazówkę Alex! Aby dodać do tego, wstawię mój „cookie dumper”, który utworzyłem na przykładzie Alexa. Może to pomoże komuś innemu.

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

Możesz nawet dodać to jako kategorię do rozszerzenia NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

+1 za wyodrębnienie logiki wyświetlania pliku cookie w osobnej metodzie! Nawet przy tak małym fragmencie to pomaga !!
Guven

Dziękuję Ci! Jest tam literówka: [wersja pliku cookie] to NSUInteger, więc należy użyć% d.
Pavel Alexeev

3

Alex wpadł na świetny pomysł, żeby umieścić to w kategorii. Oto, czego ostatecznie użyłem:

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

Sprawia, że ​​wynik jest bardziej „JSON-y” ...


1

w sandbox:Library->Cookies->Cookies.binarycookies ale nie możesz .binarycookiebezpośrednio otworzyć s, możesz uruchomić skrypt:

  1. Pobierz i zainstaluj Python

  2. Pobierz BinaryCookieReader.py

  3. Uruchom „Python BinaryCookieReader.py” na terminalu

wprowadź opis obrazu tutaj

jak widać, dziennik wyjściowy zawiera szczegółowy opis plików cookie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.