Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 应用程序退出时未保存NSHTTPCookie存储状态。是否有明确的知识/文件?_Objective C_Ios_Cookies_Nshttpcookie - Fatal编程技术网

Objective c 应用程序退出时未保存NSHTTPCookie存储状态。是否有明确的知识/文件?

Objective c 应用程序退出时未保存NSHTTPCookie存储状态。是否有明确的知识/文件?,objective-c,ios,cookies,nshttpcookie,Objective C,Ios,Cookies,Nshttpcookie,正在努力解决这个问题,不愿意实现定制的cookie管理系统 似乎iOS实现HTTP的某些隐藏级别无法正确管理无会话cookie。每当HTTP响应设置或删除cookie时,立即检查NSHTTPCookie存储cookie将产生预期结果并指示正确的sessionOnly值 但是,如果应用程序在响应更新cookies后不久退出,则在重新启动这些sessionOnly=FALSE cookies时,cookies将恢复到以前的某个状态,并且最近的更新将丢失 Cookie是由响应头设置/删除还是由NSHT

正在努力解决这个问题,不愿意实现定制的cookie管理系统

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

但是,如果应用程序在响应更新cookies后不久退出,则在重新启动这些sessionOnly=FALSE cookies时,cookies将恢复到以前的某个状态,并且最近的更新将丢失

Cookie是由响应头设置/删除还是由NSHTTPPCookieStorage setCookie:设置/删除没有区别

某些缓存/同步巫毒必须在幕后进行。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];

}
此代码应在每次启动时输出一个新值。相反,你会发现,如果你很快退出应用程序,该值将保持不变

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


听起来像是需要一个底层NSUserDefaults样式的“同步”调用。我认为最好的办法是在标准NSUserDefaults中分别管理所有应用程序的cookie,并在启动时将丢失的cookie同步到NSHTTPCookie存储中。或者,如果你觉得勇敢,看看是否有一些私人同步方法:)

我想答案在于你问题中链接到的一些帖子:

我制作了一个样本项目来重现这个问题,发现它 只有当应用程序收到SIGKILL信号时才会发生,例如 调试器从Xcode中停止。在我的实验中,未经处理 异常、崩溃、退出()和中止()不会导致 NSHTPPookie存储到松散数据

因为这看起来像是一个仅调试的问题(仅在使用 调试器),我关闭了之前填充的雷达


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

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

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) 现在,在应用程序重新启动时重新创建它们:

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

}
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项
{
NSMutableArray*cookieDictionary=[[NSUserDefaults standardUserDefaults]valueForKey:@“cookieArray”];
NSLog(@“找到的cookie字典是%@”,cookieDictionary);
for(int i=0;i

谢谢

谢谢您的更新。我还没有检查那里做的调查,但听起来已经足够彻底了。意识到导致这种行为的有限条件应该足以避免这种陷阱。这仍然与Xcode 6.4和模拟器版本8.4(SimulatorApp-565.9 CoreSimulator-117.15)有关。这个问题仍然出现在Xcode 7.0.1和模拟器9.1中。还值得注意的是,这可能发生在物理设备上,例如,如果cookie值更改后应用程序很快被终止,这应该是公认的答案。Cookie不会在应用程序退出时全局保存。此解决方案确保在删除和恢复应用程序时存在cookie。非常感谢。