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

苦于解决这个问题,并且不愿意实现一个自定义的cookiepipe理系统。

看起来,iOS的一些隐藏级别的HTTP实现无法正确pipe理会话的cookie。 任何时候HTTP响应设置或删除一个cookie,立即检查NSHTTPCookieStoragecookies将产生预期的结果,并指出正确的sessionOnly值。

但是,如果应用在响应更新后立即退出,则在重新启动后,那些sessionOnly = FALSE Cookie将恢复到之前的状态,并且最近的更新丢失。

无论cookie是由响应头还是NSHTTPCookieStorage setCookie设置/删除:没有区别。

一些caching/同步巫术必须在幕后进行。 cookie的持续时间可以长达5秒。

任何人有或可以指出一些明确的解释这种行为? 这是一个错误,简单而简单吗? 还是一些我无法理解的无目的的function?

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

- (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可用的应用程序重新打开?

iPhone:NSHTTPCookie不会保存在应用程序重新启动

NSHTTPCookies拒绝被删除

删除NSHTTPCookie返回,如果应用程序被终止

我认为答案在于你的问题中的一个 SOpost:

我做了一个示例项目来重现这个问题,并发现只有当应用程序收到SIGKILL信号时才会发生,就像在Xcode中停止debugging器一样。 在我的实验中,未处理的exception,崩溃,exit()和abort()不会导致NSHTPPCookieStorage丢失数据。

由于这看起来像一个纯粹的debugging问题(它只发生在使用debugging器时),我closures了之前填充的雷达。

您可以通过正常重新启动手机来testing这一点,并观察对NSHTTPCookieStorage的所有更改都被正确保存并重新加载。

我也有同样的问题,但我find了一个解决scheme。 我保存了浏览器创build的cookies,然后重新启动应用程序。

1)通过uiwebview创build时保存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)现在重新创build应用程序重新启动:

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

谢谢

听起来像一个基本的NSUserDefaults风格的“同步”调用是必需的。 我认为你最好的办法是在标准的NSUserDefaults中分别pipe理你所有的应用程序的cookie,并在启动时将任何缺less的cookie同步到NSHTTPCookieStorage中。 或者看看是否有一些私人同步方法,如果你感到勇敢:)