Onde os cookies de um UIWebView são armazenados?


97

Estou construindo um aplicativo para iPhone com cookies. Excluir cookies nas configurações do Safari não os exclui. Onde eles estão armazenados? É possível lê-los de outro UIWebView?

Obrigado!

Respostas:


171

Seu aplicativo tem seu próprio "jarro de biscoitos" no [NSHTTPCookieStorage sharedHTTPCookieStorage]contêiner.

Veja como você pode dar uma olhada rápida nos cookies do frasco de cookies do seu aplicativo:

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

Vários métodos estão disponíveis para filtragem e manipulação. Dê uma olhada na documentação NSHTTPCookieStorage para acessar cookies e na documentação NSHTTPCookie para acessar propriedades de cookies individuais.


1
Isso é interessante. Eu não sabia que tal coisa existia. Obrigado por apontar isso.
Brad Larson

Obrigado, Alex! Exatamente o que eu estava procurando.
ponto

Isso é ótimo! Como faço para registrar um cookie específico para um servidor específico?
Lior Frenkel,

Para obter cookies para um servidor específico, use o cookiesForURLmétodo em vez decookies
gyimi

3
Este método realmente não funciona porque isso só excluirá os cookies até que você feche o aplicativo. Mas quando você reabri-lo, os cookies ainda estarão lá.
Felipe Brahm

21

Obrigado pela indicação Alex! Para adicionar a isso, colocarei meu "dumper de cookies" que criei usando o exemplo de Alex. Talvez isso ajude outra pessoa.

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

Você pode até adicionar isso como uma categoria a ser estendida NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

1 para extrair a lógica de como exibir um cookie em um método separado! Mesmo para um pequeno trecho, isso ajuda !!
Guven

Obrigado! Há um erro de digitação: [versão do cookie] é NSUInteger, então% d deve ser usado.
Pavel Alexeev

3

Alex teve uma ótima ideia sobre colocar isso em uma categoria. Aqui está o que acabei 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

Torna a saída um pouco mais "JSON-y" ...


1

em sandbox:Library->Cookies->Cookies.binarycookies mas você não pode abrir o .binarycookies diretamente, você pode executar um script:

  1. Baixe e instale o Python

  2. Baixe BinaryCookieReader.py

  3. Execute "Python BinaryCookieReader.py" no terminal

insira a descrição da imagem aqui

como você pode ver, o log de saída contém a descrição detalhada dos cookies

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.