objective-c - 如何在 objective-c 中维护 session ?

标签 objective-c cocoa-touch

所以我遇到了以下问题:

我有一个登录 View Controller 和一个表单 View Controller 。在登录 View Controller 上,我向 PHP 脚本发送一个 POST 请求,该脚本验证用户是否具有访问权限。该脚本只返回 1 或 0。因此我可以选择关闭或维护 View Controller 。当凭据正确传递时,用户将看到表单 Controller 。这个 Controller 有一个按钮来获取表单。

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

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

最佳答案

如果您正在使用 NSURLConnection,并且 session 是基于 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];

而且你还必须实现 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];
}

如果您在 header 中有一些其他信息并且需要随后续请求发回,您可以像这样从响应中读取它

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

然后像这样设置下一个请求的头域

    [request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];

要保存信息,无论是用户名和/或密码还是 session 信息,您都可以使用 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"];

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

Google for Apple 关于 MVC 的文档。

希望这对您有所帮助!

关于objective-c - 如何在 objective-c 中维护 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7038677/

相关文章:

objective-c - 覆盖核心数据 setter : warning: 'MyClass' may not respond to '-setPrimitiveName:newName:'

ios - 将 CocoaPods 与 2 个项目一起使用时,运行时输出 objc[69590]

iphone - 在 iPhone 应用程序中管理自定义属性列表键的传统方法是什么?

iphone - 为什么自动释放对于 iPhone 应用程序特别危险/昂贵?

iphone - 在特定时间向 iPhone 发送当前位置

ios - 使用 corebluetooth 将大型二进制字符串从 ios 应用程序传输到 BLE 设备

objective-c - 检测 UIScrollview 滚动超过底部

iphone - 在 iOS 中将 NSArray 字典转换为 JSON 数组

iphone - 保留CGPath对象时遇到麻烦(出现警告)

cocoa-touch - 绘制圆并存储在 UIImage 中