我是iOS开发的新手。我正在使用NSURLSession来管理会话信息。下面是我用来调用任何服务器API的示例代码,
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error)
{ }];
我的应用流程是,如果没有登录 - >登录(呼叫登录api)Else转到主屏幕并调用其他API。
我的问题是,一旦从内存中删除了应用程序,就不会维护会话信息,我必须再次调用Login。我的要求类似于Facebook,用户只需登录一次,并且在下次应用程序启动期间维护其会话。
编辑: 我想我必须通过获取和设置cookie来处理这些请求。我搜索了这个,但没有找到任何合适的样本。任何人都可以帮我提一些关于我的问题的好样本。
谢谢!
答案 0 :(得分:10)
我终于通过混合来自多个帖子的答案找到了解决方案。如果有人知道任何更好的方法或以下方法的任何更正,请发布。
在我对登录API的调用中,我执行以下操作,
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error)
{
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[httpResp allHeaderFields] forURL:[response URL]];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];
for (NSHTTPCookie *cookie in cookies) {
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:31536000] forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
NSLog(@"name:%@ value:%@", cookie.name, cookie.value);
}
}];
这里最重要的部分是" dateByAddingTimeInterval:31536000"。这将设置cookie到期时间,以秒为单位。如果未设置,则会话仅保留一次。
最后退出时,我清除了所有的cookie。
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *each in cookieStorage.cookies) {
[cookieStorage deleteCookie:each];
}