Où sont stockés les cookies d'une UIWebView?


97

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

Merci!

Réponses:


171

Votre application a son propre "pot à cookies" dans le [NSHTTPCookieStorage sharedHTTPCookieStorage]conteneur.

Voici comment vous pouvez jeter un coup d'œil aux cookies dans le pot à cookies de votre 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 NSHTTPCookieStorage documentation pour l' accès aux cookies et la NSHTTPCookie documentation pour l' accès aux propriétés des cookies individuels.


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

Merci Alex! Exactement ce que je cherchais.
point

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

Pour obtenir des cookies pour un serveur spécifique, utilisez la cookiesForURLméthode à la place decookies
gyimi

3
Cette méthode ne fonctionne pas vraiment car elle ne supprimera les cookies que jusqu'à ce que vous quittiez l'application. Mais lorsque vous le rouvrez, les cookies seront toujours là.
Felipe Brahm

21

Merci pour le pointeur Alex! Pour ajouter à cela, je vais déposer 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;
}

Vous pourriez même ajouter ceci comme catégorie à étendre NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

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

Je vous remercie! Il y a une faute de frappe: [version du cookie] est NSUInteger, donc% d doit être utilisé.
Pavel Alexeev

3

Alex a eu une excellente idée de mettre cela dans une catégorie. Voici ce que j'ai 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

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


1

dans , sandbox:Library->Cookies->Cookies.binarycookies mais vous ne pouvez pas ouvrir le .binarycookies directement, vous pouvez exécuter un script:

  1. Téléchargez et installez Python

  2. Télécharger BinaryCookieReader.py

  3. Exécutez "Python BinaryCookieReader.py" sur le terminal

entrez la description de l'image ici

comme vous pouvez le voir, le journal de sortie contient une description détaillée des cookies

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.