NSHTTPCookieStorage的共享实例不会保留cookie

Mox*_*oxy 14 iphone nshttpcookie ios ios5

我正在开发一个应用程序,其中服务器递给我一个cookie来识别用户.

我的连续请求需要使用该cookie来获得用户期望的响应.我无法理解的是NSHTTPCookieStorage的共享实例如何以及何时丢失其cookie.

我使用的第一个解决方案是将cookie从我的服务器存档并保存到应用程序终端的用户默认值,然后在应用程序启动时从我的服务器清除现有的cookie并重置我存储的那些.通过开发过程我没有遇到问题,因为调试会话非常短,通常不需要将应用程序放在后台.

在beta测试期间,麻烦开始了.我带来的黑客攻击不仅是在应用程序终止时保存cookie,而且还在API调用后将这些cookie保存回来.并且不仅在应用程序启动时加载已保存的cookie,而且还在应用程序返回到前台时加载.

为什么NSHTTPCookieStorage共享实例摆脱了这些cookie以及处理它的最佳实践是什么,因为它是我的应用程序的重要部分,如果没有经验丰富的开发人员支持,我不能相信这样一个被黑客入侵的解决方案.

提前感谢您的回答

编辑:以下是保存/读取/清除cookie的方法

-(void)saveStoredCookies
{
    NSURL *httpUrl = @"http://myServer.com";
    NSURL *httpsUrl = @"https://myServer.com";

    NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
    NSData *httpCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpCookies];
    [[NSUserDefaults standardUserDefaults] setObject:httpCookiesData forKey:@"savedHttpCookies"];

    NSArray *httpsCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
    NSData *httpsCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpsCookies];
    [[NSUserDefaults standardUserDefaults] setObject:httpsCookiesData forKey:@"savedHttpsCookies"];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(void)readStoredCookies
{
    //clear, read and install stored cookies
    NSURL *httpUrl = @"http://myServer.com";
    NSURL *httpsUrl = @"https://myServer.com";

    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }

    NSData *httpCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpCookies"];
    if([httpCookiesData length]) {
        NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpCookiesData];
        for (NSHTTPCookie *cookie in savedCookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }       
    }
    NSData *httpsCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpsCookies"];
    if([httpsCookiesData length]) {
        NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpsCookiesData];
        for (NSHTTPCookie *cookie in savedCookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }       
    }
}

-(void)clearStoredCookies
{
    NSURL *httpUrl = @"http://myServer.com";
    NSURL *httpsUrl = @"https://myServer.com";
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
    for (NSHTTPCookie *cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}
Run Code Online (Sandbox Code Playgroud)

Hum*_*yun 18

NSHttpCookieStorage丢失其cookie,因为您没有设置cookie的到期时间.设置到期时间是必要的,否则当您的应用退出时,您的Cookie将会丢失.

这是我在app退出和启动期间如何存储我的cookie的快速浏览,

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:name forKey:NSHTTPCookieName];
[cookieProperties setObject:strValue forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieDomain];    // Without http://
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieOriginURL]; // Without http://
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

// set expiration to one month from now or any future NSDate of your choice
// this makes the cookie sessionless and it will persist across web sessions and app launches
/// if you want the cookie to be destroyed when your app exits, don't set this
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Ste*_*her 6

这是模拟器吗?并使用滚动饼干?

在模拟器中,cookie 并没有像它们应该的那样真正持久化,因为它们与桌面 Safari 共享。随着 cookie 的滚动,一个最终会覆盖另一个。

这不是设备本身的问题,每个应用程序都有自己的 cookie 存储。(而且,说实话,我还没有注意到它发生在山狮身上。)


Mox*_*oxy 0

解决了 !

经过一些简单的调试后,我发现问题出在我在cookiesForURL:. 我只是开始使用cookies财产,现在它工作正常。