NSHTTPCookieStorage状态未保存在应用程序出口上。那里有任何明确的知识/文件吗?

时间:2011-04-29 21:44:36

标签: objective-c ios cookies nshttpcookie

遇到这个问题而不愿意实施自定义cookie管理系统。

似乎某些隐藏级别的iOS实施的HTTP无法正确管理无会话cookie。每当HTTP响应设置或删除cookie时,立即检查NSHTTPCookieStorage cookie将产生预期结果并指示正确的sessionOnly值。

但是,如果应用程序在响应更新cookie后立即退出,则重新启动时,这些sessionOnly = FALSE cookie将恢复为某个先前状态,并且最新更新将丢失。

是否通过响应标头或NSHTTPCookieStorage setCookie设置/删除cookie:没有区别。

一些缓存/同步伏都教必须在幕后进行。 cookie变为持久化所需的时间最长可达5秒。

那里有谁或者可以指出对这种行为的明确解释?这是一个简单明了的bug吗?还是一些我无法理解的无证特征?

您可以使用一些代码重现:

- (void)applicationDidBecomeActive:(UIApplication *)application
{

    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

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

    NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
    [cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName];
    [cookieProperties setObject:[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] forKey:NSHTTPCookieValue];
    [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain];
    [cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL];
    [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
    [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

    // set expiration to one month from now
    [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

    cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

}

此代码应在每次启动时输出新值。相反,您会看到,如果您快速退出应用程序,则值将保持不变。

一些可能相关的堆栈溢出问题:

iphone NSHTTPCookieStorage avaible on app reopen?

iPhone: NSHTTPCookie is not saved across app restarts

NSHTTPCookies refuse to be deleted

deleted NSHTTPCookie returns if app is terminated

3 个答案:

答案 0 :(得分:25)

我认为答案在于one与你问题相关的SO帖子:

  

我做了一个示例项目来重现这个问题 - 并且发现了它   只有当应用程序收到SIGKILL信号时才会发生,例如   调试器在Xcode中停止。在我的实验中,未经处理   异常,崩溃,exit()和abort()不会导致   NSHTPPCookieStorage松散数据。

     

因为这看起来只是一个调试问题(只有在使用时才会发生)   调试器),我关闭了之前填充的雷达。

您可以通过正常重新启动手机并观察NSHTTPCookieStorage的所有更改是否已正确保留并重新加载来测试。

答案 1 :(得分:14)

我也遇到了同样的问题,但我找到了解决方案。我保存了由浏览器创建的cookie,然后在应用程序重新启动时重新创建它们。

1)在uiwebview创建cookie时保存cookie。

 NSMutableArray *cookieArray = [[NSMutableArray alloc] init];
    for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
        [cookieArray addObject:cookie.name];
        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
        [cookieProperties setObject:cookie.name forKey:NSHTTPCookieName];
        [cookieProperties setObject:cookie.value forKey:NSHTTPCookieValue];
        [cookieProperties setObject:cookie.domain forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:cookie.path forKey:NSHTTPCookiePath];
        [cookieProperties setObject:[NSNumber numberWithInt:cookie.version] forKey:NSHTTPCookieVersion];

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        [[NSUserDefaults standardUserDefaults] setValue:cookieProperties forKey:cookie.name];
        [[NSUserDefaults standardUserDefaults] synchronize];

    }

    [[NSUserDefaults standardUserDefaults] setValue:cookieArray forKey:@"cookieArray"];
    [[NSUserDefaults standardUserDefaults] synchronize];

2)现在重新启动它们作为app restarts:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    NSMutableArray* cookieDictionary = [[NSUserDefaults standardUserDefaults] valueForKey:@"cookieArray"];
     NSLog(@"cookie dictionary found is %@",cookieDictionary);

    for (int i=0; i < cookieDictionary.count; i++) 
{


        NSLog(@"cookie found is %@",[cookieDictionary objectAtIndex:i]);
        NSMutableDictionary* cookieDictionary1 = [[NSUserDefaults standardUserDefaults] valueForKey:[cookieDictionary objectAtIndex:i]];
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDictionary1];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];


 }

    // other code

}

感谢

答案 2 :(得分:4)

听起来像底层的NSUserDefaults风格的“同步”调用是必需的。我认为您最好的选择是在标准NSUserDefaults中单独管理所有应用程序的cookie,并在启动时将任何缺失的cookie同步到NSHTTPCookieStorage中。或者如果你有勇气,看看是否有一些私人同步方法:)