¿Dónde se almacenan las cookies de UIWebView?

97

Estoy creando una aplicación para iPhone con cookies. Eliminar las cookies en la configuración de Safari no las elimina. ¿Dónde se almacenan? ¿Es posible leerlos desde otra UIWebView?

¡Gracias!

punto
fuente

Respuestas:

171

Tu aplicación tiene su propio "tarro de galletas" en el [NSHTTPCookieStorage sharedHTTPCookieStorage] contenedor.

Así es como puede echar un vistazo rápido a las cookies en el tarro de cookies de su aplicación:

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

Hay varios métodos disponibles para el filtrado y la manipulación. Echar un vistazo a la NSHTTPCookieStorage documentación para las galletas con el acceso y la NSHTTPCookie documentación para acceder a las propiedades de galletas individuales.

Alex Reynolds
fuente
1
Eso es interesante. No sabía que existía tal cosa. Gracias por mencionarlo.
Brad Larson
¡Gracias Alex! Exactamente lo que estaba buscando.
punto
¡Eso es genial! ¿Cómo registro una cookie específica para un servidor específico?
Lior Frenkel
Para obtener cookies para un servidor específico, use el cookiesForURLmétodo en lugar decookies
gyimi
3
Este método no funciona realmente porque solo eliminará las cookies hasta que salga de la aplicación. Pero cuando lo vuelvas a abrir, las cookies seguirán ahí.
Felipe Brahm
21

¡Gracias por el puntero Alex! Para agregar a esto, colocaré mi "descargador de galletas" que creé usando el ejemplo de Alex. Quizás esto ayude a alguien más.

- (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
fuente
Incluso podría agregar esto como una categoría para extender NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds
+1 para extraer la lógica de cómo mostrar una cookie en un método separado. ¡Incluso para un fragmento tan pequeño, ayuda!
Guven
¡Gracias! Hay un error tipográfico: [la versión de la cookie] es NSUInteger, por lo que se debe usar% d.
Pavel Alexeev
3

Alex tuvo una gran idea sobre poner esto en una categoría. Esto es lo que terminé usando:

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

Hace que la salida sea un poco más "JSON-y" ...

DarkestOne
fuente
1

en sandbox:Library->Cookies->Cookies.binarycookies pero no puede abrir el .binarycookies directamente, puede ejecutar un script:

  1. Descarga e instala Python

  2. Descarga BinaryCookieReader.py

  3. Ejecute "Python BinaryCookieReader.py" en la terminal

ingrese la descripción de la imagen aquí

como puede ver, el registro de salida contiene una descripción detallada de las cookies

xy z
fuente