Cookie của UIWebView được lưu trữ ở đâu?


97

Tôi đang xây dựng một ứng dụng iPhone với cookie. Xóa cookie trong cài đặt Safari không xóa chúng. Chúng được lưu trữ ở đâu? Có thể đọc chúng từ UIWebView khác không?

Cảm ơn!

Câu trả lời:


171

Ứng dụng của bạn có "lọ cookie" riêng trong vùng [NSHTTPCookieStorage sharedHTTPCookieStorage]chứa.

Đây là cách bạn có thể xem nhanh các cookie trong hộp cookie của ứng dụng của bạn:

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

Một số phương pháp có sẵn để lọc và thao tác. Hãy xem tài liệu NSHTTPCookieStorage để truy cập cookie và tài liệu NSHTTPCookie để truy cập các thuộc tính cookie riêng lẻ.


1
Nó thật thú vị. Tôi không biết có một thứ như vậy tồn tại. Cảm ơn đã chỉ ra điều đó.
Brad Larson

Cảm ơn, Alex! Chính xác những gì tôi đang tìm kiếm.
chấm

Thật tuyệt! Làm cách nào để ghi lại một cookie cụ thể cho một máy chủ cụ thể?
Lior Frenkel

Để có được các tập tin cookie cho một máy chủ cụ thể, sử dụng các cookiesForURLphương pháp thay vìcookies
gyimi

3
Phương pháp này không thực sự hoạt động vì điều này sẽ chỉ xóa cookie cho đến khi bạn thoát khỏi ứng dụng. Nhưng khi bạn mở lại, cookie sẽ vẫn ở đó.
Felipe Brahm

21

Cảm ơn vì con trỏ Alex! Để thêm vào điều này, tôi sẽ thả vào "trình kết xuất cookie" mà tôi đã tạo bằng cách sử dụng ví dụ của Alex. Có thể điều này sẽ giúp ích cho người khác.

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

Bạn thậm chí có thể thêm vào này như một phạm trù mở rộng NSHTTPCookieStorage: macdevelopertips.com/objective-c/objective-c-categories.html
Alex Reynolds

+1 để rút ra logic về cách hiển thị cookie thành một phương pháp riêng biệt! Ngay cả đối với một đoạn trích nhỏ như vậy, nó sẽ giúp !!
Guven

Cảm ơn bạn! Có lỗi đánh máy: [phiên bản cookie] là NSUInteger, vì vậy% d nên được sử dụng.
Pavel Alexeev

3

Alex đã có một ý tưởng tuyệt vời về việc đưa nó vào một danh mục. Đây là những gì tôi đã sử dụng:

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

Làm cho đầu ra "JSON-y" nhiều hơn một chút ...


1

trong sandbox:Library->Cookies->Cookies.binarycookies nhưng bạn không thể mở .binarycookietrực tiếp, bạn có thể chạy một tập lệnh:

  1. Tải xuống và cài đặt Python

  2. Tải xuống BinaryCookieReader.py

  3. Chạy "Python BinaryCookieReader.py" trên thiết bị đầu cuối

nhập mô tả hình ảnh ở đây

như bạn có thể thấy, nhật ký đầu ra chứa mô tả cookie chi tiết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.