Di mana cookie UIWebView disimpan?


97

Saya sedang membangun aplikasi iPhone dengan cookie. Menghapus cookie di pengaturan Safari tidak menghapusnya. Di mana mereka disimpan? Apakah mungkin untuk membacanya dari UIWebView lain?

Terima kasih!

Jawaban:


171

Aplikasi Anda memiliki "toples kue" sendiri di dalam [NSHTTPCookieStorage sharedHTTPCookieStorage]wadah.

Berikut adalah cara Anda dapat melihat sekilas cookie di toples cookie aplikasi Anda:

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

Beberapa metode tersedia untuk pemfilteran dan manipulasi. Lihatlah di NSHTTPCookieStorage dokumentasi untuk mengakses cookie, dan NSHTTPCookie dokumentasi untuk mengakses properti kue individu.


1
Itu menarik. Saya tidak tahu hal seperti itu ada. Terima kasih telah menunjukkannya.
Brad Larson

Terima kasih, Alex! Persis apa yang saya cari.
titik

Itu hebat! Bagaimana cara mencatat cookie tertentu untuk server tertentu?
Lior Frenkel

Untuk mendapatkan cookie untuk server tertentu, gunakan cookiesForURLmetode sebagai pengganticookies
gyimi

3
Metode ini tidak benar-benar berfungsi karena ini hanya akan menghapus cookie sampai Anda keluar dari aplikasi. Tetapi ketika Anda membukanya kembali, cookie akan tetap ada.
Felipe Brahm

21

Terima kasih atas penunjuk Alex! Untuk menambahkan ini, saya akan memasukkan "cookie dumper" yang saya buat menggunakan contoh Alex. Mungkin ini akan membantu orang lain.

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

Anda bahkan dapat menambahkan ini sebagai kategori untuk diperluas NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

1 untuk mengekstraksi logika tentang cara menampilkan cookie ke dalam metode terpisah! Bahkan untuk potongan kecil seperti itu, itu membantu !!
Guven

Terima kasih! Ada kesalahan ketik: [versi cookie] adalah NSUInteger, jadi% d harus digunakan.
Pavel Alexeev

3

Alex punya ide bagus untuk memasukkan ini ke dalam kategori. Inilah yang akhirnya saya gunakan:

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

Membuat keluaran sedikit lebih "JSON-y" ...


1

di sandbox:Library->Cookies->Cookies.binarycookies tetapi Anda tidak dapat membuka .binarycookies secara langsung, Anda dapat menjalankan skrip:

  1. Unduh dan instal Python

  2. Unduh BinaryCookieReader.py

  3. Jalankan "Python BinaryCookieReader.py" di terminal

masukkan deskripsi gambar di sini

seperti yang Anda lihat, log keluaran berisi deskripsi detail cookie

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.