gpt4 book ai didi

iphone - NSHTTPCookieStorage 的共享实例不会保留 cookie

转载 作者:技术小花猫 更新时间:2023-10-29 10:15:37 25 4
gpt4 key购买 nike

我正在开发一个应用程序,服务器会给我一个 cookie 来识别用户。

我的后续请求需要有该 cookie 才能获得用户期望的响应。我无法理解的是 NSHTTPCookieStorage 的共享实例如何以及何时丢失其 cookie。

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

在 Beta 测试期间,麻烦开始了。我使用的技巧是不仅在应用程序终止时保存 cookie,而且在 API 调用返回给我这些 cookie 之后也保存 cookie。并且不仅在应用启动时而且在应用返回前台时加载保存的 cookie。

为什么 NSHTTPCookieStorage 共享实例会摆脱这些 cookie,处理它的最佳做法是什么,因为它是我应用程序的重要组成部分,如果没有更有经验的开发人员支持,我不能相信这样一个被黑的解决方案。

预先感谢您的回答

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

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

最佳答案

NSHttpCookieStorage 丢失了它的 cookie,因为你没有设置 cookie 的过期时间。设置过期时间是必要的,否则您的 cookie 将在您的应用程序退出时丢失。

这里是我如何在应用程序退出和启动期间存储我的 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];

希望这对您有所帮助。

关于iphone - NSHTTPCookieStorage 的共享实例不会保留 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11570737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com