2009-04-21 12 views
96

Je construis une application iPhone avec des cookies. La suppression des cookies dans les paramètres Safari ne les supprime pas. Où sont-ils stockés? Est-il possible de les lire depuis un autre UIWebView?Où sont stockés les cookies d'UIWebView?

Merci!

Répondre

168

Votre application a son propre "cookie jar" dans le conteneur [NSHTTPCookieStorage sharedHTTPCookieStorage].

Voilà comment vous pouvez jeter un coup d'œil sur les cookies dans votre boîte à biscuits de l'application:

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

Plusieurs méthodes sont disponibles pour le filtrage et la manipulation. Jetez un oeil à la documentation NSHTTPCookieStorage pour l'accès aux cookies, et la documentation NSHTTPCookie pour accéder aux propriétés individuelles des cookies.

+1

C'est intéressant. Je ne savais pas qu'une telle chose existait. Merci de l'avoir signalé. –

+0

Merci, Alex! Exactement ce que je cherchais. – dot

+0

C'est génial! Comment enregistrer un cookie spécifique pour un serveur spécifique? –

20

Merci pour le pointeur Alex! Pour ajouter à cela, je vais déposer dans mon "cookie dumper" que j'ai créé en utilisant l'exemple d'Alex. Peut-être que cela aidera quelqu'un d'autre.

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

Vous pouvez même ajouter ceci comme une catégorie pour étendre 'NSHTTPCookieStorage': http://macdevelopertips.com/objective-c/objective-c-categories.html –

+0

+1 pour extraire la logique de la façon d'afficher un cookie dans un méthode séparée! Même pour un si petit extrait, ça aide !! – Guven

+0

Merci! Il y a une faute de frappe: [cookie version] est NSUInteger, donc% d devrait être utilisé. –

3

Alex a eu une bonne idée de mettre cela dans une catégorie. Voici ce que je fini par utiliser:

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 

Makes la sortie un peu plus "JSON-y" ...

Questions connexes