Dove vengono memorizzati i cookie di UIWebView?


97

Sto creando un'app per iPhone con i cookie. L'eliminazione dei cookie nelle impostazioni di Safari non li elimina. Dove sono conservati? È possibile leggerli da un altro UIWebView?

Grazie!

Risposte:


171

La tua applicazione ha il suo "barattolo di biscotti" nel [NSHTTPCookieStorage sharedHTTPCookieStorage]contenitore.

Ecco come potresti dare una rapida occhiata ai cookie nel barattolo dei cookie della tua applicazione:

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

Sono disponibili diversi metodi per il filtraggio e la manipolazione. Dai un'occhiata alla documentazione NSHTTPCookieStorage per l'accesso ai cookie e alla documentazione NSHTTPCookie per l'accesso alle proprietà dei singoli cookie.


1
Interessante. Non sapevo che esistesse una cosa del genere. Grazie per segnalarlo.
Brad Larson

Grazie, Alex! Esattamente quello che stavo cercando.
punto

È fantastico! Come registro un cookie specifico per un server specifico?
Lior Frenkel

Per ottenere i cookie per un server specifico, utilizza il cookiesForURLmetodo invece dicookies
gyimi

3
Questo metodo non funziona davvero perché eliminerà i cookie solo fino a quando non esci dall'app. Ma quando lo riaprirai i biscotti saranno ancora lì.
Felipe Brahm

21

Grazie per il puntatore Alex! Per aggiungere a questo, inserirò il mio "cookie dumper" che ho creato usando l'esempio di Alex. Forse questo aiuterà qualcun altro.

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

Potresti anche aggiungerlo come categoria da estendere NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

+1 per estrarre la logica di come visualizzare un cookie in un metodo separato! Anche per uno snippet così piccolo, aiuta !!
Guven

Grazie! C'è un errore di battitura: [versione cookie] è NSUInteger, quindi dovrebbe essere usato% d.
Pavel Alexeev

3

Alex ha avuto una grande idea di metterlo in una categoria. Ecco cosa ho finito per usare:

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

Rende l'output un po 'più "JSON-y" ...


1

in sandbox:Library->Cookies->Cookies.binarycookies ma non puoi aprire .binarycookiedirettamente la s, puoi eseguire uno script:

  1. Scarica e installa Python

  2. Scarica BinaryCookieReader.py

  3. Esegui "Python BinaryCookieReader.py" sul terminale

inserisci qui la descrizione dell'immagine

come puoi vedere, il registro di output contiene una descrizione dettagliata dei cookie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.