Где хранятся файлы cookie UIWebView?


97

Я создаю приложение для iPhone с файлами cookie. Удаление файлов cookie в настройках Safari не приводит к их удалению. Где они хранятся? Можно ли их прочитать из другого UIWebView?

Спасибо!

Ответы:


171

У вашего приложения есть собственная «банка cookie» в [NSHTTPCookieStorage sharedHTTPCookieStorage]контейнере.

Вот как вы можете быстро взглянуть на файлы cookie в банке cookie вашего приложения:

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

Для фильтрации и обработки доступны несколько методов. Взгляните на документацию NSHTTPCookieStorage для доступа к файлам cookie и документацию NSHTTPCookie для доступа к отдельным свойствам файлов cookie.


1
Это интересно. Я не знал, что такое существует. Спасибо, что указали на это.
Брэд Ларсон

Спасибо, Алекс! Именно то, что я искал.
точка

Замечательно! Как мне зарегистрировать конкретный файл cookie для определенного сервера?
Лиор Френкель

Чтобы получить файлы cookie для определенного сервера, используйте cookiesForURLметод вместоcookies
gyimi

3
Этот метод на самом деле не работает, потому что он удалит файлы cookie только до выхода из приложения. Но когда вы снова откроете его, файлы cookie останутся там.
Фелипе Брам

21

Спасибо за указатель Алекс! Чтобы добавить к этому, я добавлю свой «дампер файлов cookie», который я создал на примере Алекса. Может быть, это кому-то поможет.

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

Вы даже можете добавить это как категорию для расширения NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

+1 за извлечение логики вывода куки в отдельный метод! Даже для такого маленького фрагмента это помогает !!
Guven

Спасибо! Произошла опечатка: [версия файла cookie] - это NSUInteger, поэтому следует использовать% d.
Павел Алексеев

3

У Алекса была отличная идея поместить это в категорию. Вот что я в итоге использовал:

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

Делает вывод немного более "JSON-y" ...


1

in, sandbox:Library->Cookies->Cookies.binarycookies но вы не можете открыть .binarycookies напрямую, вы можете запустить скрипт:

  1. Скачайте и установите Python

  2. Скачать BinaryCookieReader.py

  3. Запустите "Python BinaryCookieReader.py" на терминале.

введите описание изображения здесь

как видите, выходной журнал содержит подробное описание файлов cookie

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.