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中。 或者看看是否有一些私人同步方法,如果你感到勇敢:)