如何在objective-c中维护会话?

Jac*_*tra 4 cocoa-touch objective-c

所以我遇到了以下问题:

我有一个登录viewcontroller和一个窗体viewcontroller.在登录视图控制器上,我向PHP脚本发送POST请求,该脚本验证用户是否具有访问权限.该脚本只返回1或0.所以我可以选择解除或维护viewcontroller.正确传递凭据后,用户将看到表单控制器.该控制器有一个按钮来获取表单.

获取表单的按钮向另一个PHP脚本发出POST请求,该脚本将返回带有用户值的XML文档.我需要一种方法来记住用户通过的用户名和密码.所以我可以在另一个(视图)控制器中使用它们.

有人知道实现这个目标的方法吗?

Abh*_*nit 8

如果你正在使用NSURLConnection,并且会话是基于cookie的,那么这将自动完成.所以你需要写的就是这个

NSMutableURLRequest *request = nil;
request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://server.com/login.php"]];

NSString *post = [NSString stringWithFormat:@"username=%@&password=%@", @"<username>", @"<password>"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[request setTimeoutInterval: 15];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];

_urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[_urlConnection start];
Run Code Online (Sandbox Code Playgroud)

而且您还必须实现NSURLConnectionDelegate方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [_responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    //Oops! handle failure here
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    if (_statusCode >= 200 && _statusCode < 400) {
            //Things look ok
        NSString *responseString = [[[NSString alloc] initWithData:_responseData] autorelease];
        //Send this to an xml lib and parse
        }

    [_responseData release];
    _responseData = nil;
    [connection autorelease];
}
Run Code Online (Sandbox Code Playgroud)

如果您在标题中有一些其他信息,并且需要通过后续请求发送回来,您可以从响应中读取它,如下所示

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSDictionary *headerFields = [(NSHTTPURLResponse*)response allHeaderFields]; //This would give you all the header fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

并为此下一个请求设置标题字段

    [request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
Run Code Online (Sandbox Code Playgroud)

要保存信息,可以使用NSUserDefaults作为用户名和/或密码或会话信息

    //To save
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

if (standardUserDefaults) {
    [standardUserDefaults setObject:@"<username>" forKey:@"username"];
    [standardUserDefaults setObject:@"<pass>" forKey:@"password"];
    [standardUserDefaults synchronize];
}

//To retrieve
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *val = nil;

if (standardUserDefaults) 
    val = [standardUserDefaults objectForKey:@"username"];
Run Code Online (Sandbox Code Playgroud)

最后,建议使用[例如:具有用户名和密码属性的用户类]来构建模型以映射xml API.

谷歌为Apple的MVC文档.

希望这可以帮助!