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.