【问题标题】:Where are an UIWebView's cookies stored?UIWebView 的 cookie 存储在哪里?
【发布时间】:2010-10-20 18:24:08
【问题描述】:

我正在使用 cookie 构建一个 iPhone 应用程序。在 Safari 设置中删除 cookie 不会删除它们。它们存储在哪里?是否可以从另一个 UIWebView 读取它们?

谢谢!

【问题讨论】:

    标签: iphone cookies


    【解决方案1】:

    您的应用程序在[NSHTTPCookieStorage sharedHTTPCookieStorage] 容器中有自己的“cookie jar”。

    您可以通过以下方式快速查看应用程序 cookie jar 中的 cookie:

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

    有几种方法可用于过滤和操作。查看用于访问 cookie 的 NSHTTPCookieStorage 文档和用于访问单个 cookie 属性的 NSHTTPCookie 文档。

    【讨论】:

    • 这很有趣。我不知道有这样的东西存在。感谢您指出。
    • 谢谢,亚历克斯!正是我想要的。
    • 太棒了!如何为特定服务器记录特定 cookie?
    • 要获取特定服务器的 cookie,请使用 cookiesForURL 方法而不是 cookies
    • 这个方法并没有真正起作用,因为这只会删除 cookie,直到您退出应用程序。但是当你重新打开它时,cookie 仍然存在。
    【解决方案2】:

    感谢亚历克斯的指点!除此之外,我将放入我使用 Alex 的示例创建的“cookie dumper”。也许这会对其他人有所帮助。

    - (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
    • +1 用于将如何显示 cookie 的逻辑提取到单独的方法中!即使对于这么小的sn-p,它也有帮助!
    • 谢谢!有一个错字:[cookie 版本] 是 NSUInteger,所以应该使用 %d。
    【解决方案3】:

    Alex 有一个很棒的想法,就是将其归入一个类别。这是我最终使用的:

    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”...

    【讨论】:

      【解决方案4】:

      sandbox:Library-&gt;Cookies-&gt;Cookies.binarycookies 但是你不能直接打开.binarycookies,你可以运行一个脚本:

      1. 下载并安装 Python

      2. 下载BinaryCookieReader.py

      3. 在终端运行“Python BinaryCookieReader.py”

      如您所见,输出日志包含详细的 cookie 描述

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多