2009-04-21 24 views
96

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

Gracias!

Respuesta

168

Su aplicación tiene su propia "cookie jar" en el contenedor [NSHTTPCookieStorage sharedHTTPCookieStorage].

Así es como usted puede echar un vistazo rápido a las cookies en la caja de galletas de la 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. Consulte la documentación NSHTTPCookieStorage para acceder a las cookies y la documentación NSHTTPCookie para acceder a las propiedades de cookies individuales.

+1

Eso es interesante. No sabía que existiera tal cosa. Gracias por mencionarlo. –

+0

¡Gracias, Alex! Exactamente lo que estaba buscando. – dot

+0

¡Eso es genial! ¿Cómo registro una cookie específica para un servidor específico? –

20

Gracias por el puntero Alex! Para agregar a esto voy a soltar en mi "descargador de cookies" que creé usando el ejemplo de Alex. Quizás esto ayudará 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; 
} 
+0

Incluso puede agregar esto como una categoría para extender 'NSHTTPCookieStorage': http://macdevelopertips.com/objective-c/objective-c-categories.html –

+0

+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

+0

¡Gracias! Hay un error tipográfico: [cookie version] es NSUInteger, por lo que se debe usar% d. –

3

Alex tenía una gran idea acerca de 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 un poco más "JSON-y" ...

Cuestiones relacionadas