2012-07-19 102 views
12

我开发,其中服务器递给我一个cookie来识别用户的应用程序不坚持饼干。共享NSHTTPCookieStorage实例

我连续请求需要有一个cookie来具有用户所期望的响应。 我无法理解的是NSHTTPCookieStorage的共享实例如何以及何时丢失了其Cookie。

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

在beta测试期间,麻烦开始了。 我附带的破解是不仅在应用程序终止时保存cookie,而且在将这些cookie递给我的API调用之后也保存这些cookie。并且不仅在应用程序启动时加载保存的Cookie,而且在应用程序返回到前台时也加载。

NSHTTPCookieStorage共享实例如何摆脱这些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]; 
    } 
} 
+0

请根据您使用的代码进行更新,以便在发出新请求时将Cookie从Cookie存储区中取出。你的描述是不够的。 – 2012-08-09 03:23:50

+0

您没有看到问题,因为您无法在测试期间在新会话之间加载来自存储的Cookie。 – 2012-08-09 03:27:15

回答

-1

解决!

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

+0

请更新您的代码,我处于相同情况 – Halid 2016-07-28 11:30:56

+0

对不起,但我无法再访问该代码。它是从4年前开始的。 – Moxy 2016-07-28 14:54:38

+0

@Moxy我需要帮助 – Siva 2017-09-15 09:04:52

18

NSHttpCookieStorage失去了它的饼干,因为你没有设置过期时间饼干。设置到期时间是必要的,否则当您的应用程序退出时,您的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]; 

希望这有助于。

+0

到期日期已由服务器设置 – Moxy 2012-08-10 20:10:33

+0

我将您的答案授予赏金,虽然它不是我的解决方案,但它让我发现我在代码中错过的东西(使用我使用的URL,我没有存储任何Cookie) 。我现在正在度假,带着我的冲浪课,我回家太累,无法触摸我的代码。当我改变某些东西时,我会编辑我的问题。 – Moxy 2012-08-12 18:59:44

2

马云可能是正确的 -

但是你不应该写入cookie NSUserDefaults的到 -

的sharedHTTPCookieStorage的整点是你从那里阅读。

NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl]; 

出于安全原因,您甚至不应该能够将这些cookie写入NSUserDefaults。 但也许你可以。无论哪种方式,它可能超时没有设置为humayun提到。

无论哪种方式,请重构代码,并尽量不要储存cookies在使用者偏好。

+0

但问题是,他们不坚持共享HTTPCookieStorage。我已经检查了从服务器传递过来的过期日期,并且设置的很好(在很长一段时间之前不会过期) – Moxy 2012-08-10 20:08:20

2

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

在模拟器,饼干真的不坚持,因为他们应该,因为他们与桌面Safari浏览器共享。当饼干翻转时,最终会覆盖另一个饼干。

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

+0

我正在使用真实设备 – Moxy 2012-08-12 18:45:05

+1

谢谢!试图找出为什么cookie不会在模拟器上持续存在,从而让我疯狂。 – 2016-01-23 01:07:53