OSChina中账号登录用的是ASIHTTPRequest,而不是后面使用的AFNetworking。关于为什么不使用同一个类库,我网上查了下(原文地址:http://www.infoq.com/cn/articles/afn_vs_asi)
AFN适合逻辑简单的应用,或者更适合开发资源尚不丰富的团队,因为AFN的易用性要比ASI好很多,而这样的应用(或团队)对底层网络控件的定制化要求也非常低。ASI更适合已经发展了一段时间的应用,或者开发资源相对丰富的团队,因为往往这些团队(或他们的应用)已经积累了一定的经验,无论是产品上还是技术上的。需求复杂度就是在这种时候高起来,而且底层订制的需求也越来越多,此时AFN就很难满足需求,需要牺牲一定的易用性,使用ASI作为网络底层控件。SegmentFault开源客户端现在被设计为一款简单的阅读客户端,几乎没有定制要求,因此,目前我选择了AFN作为网络控件。
先不管ASI和AFN的的区别了,现在先来看看我们怎么验证账号吧,这里新建一个项目LoginVerify。新建一个LoginViewController,有:
#import "LoginViewController.h" #import "ASIHTTPRequest.h" #import "ApiError.h" #import "Tool.h" #import "NewsTableController.h" @interface LoginViewController () @end @implementation LoginViewController @synthesize userName; @synthesize passWord; @synthesize loginBtn; NSString *name,*pwd; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; [loginBtn addTarget:self action:@selector(login) forControlEvents:UIControlEventTouchUpInside]; } -(void)login { name = self.userName.text; pwd = self.passWord.text; //判断用户名、密码是否为空 if([name length] == 0 || [pwd length] == 0) { UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"密码或用户名不能为空" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; } else { //1.提交数据到服务器 request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"https://www.oschina.net/action/api/login_validate"]]; [request setUseCookiePersistence:YES]; [request setPostValue:name forKey:@"username"]; [request setPostValue:pwd forKey:@"pwd"]; [request setPostValue:@"1" forKey:@"keep_login"]; [request setDelegate:self]; [request setDidFailSelector:@selector(requestFailed:)]; [request setDidFinishSelector:@selector(requestLogin:)]; [request startAsynchronous]; } } - (void)requestFailed:(ASIHTTPRequest *)request{ NSLog(@"登录验证失败"); } - (void)requestLogin:(ASIHTTPRequest *)request{ //登录验证成功 ApiError *error = [Tool getApiError2:request.responseString]; //根据ApiError来决定处理流程 switch (error.errorCode) { case 1: //用户名、密码正确 { //持久化用户名、密码 [[[Tool alloc]init]saveUserNameAndPwd:name andPwd:pwd]; //跳转界面 NewsTableController *newsTableController = [[NewsTableController alloc]initWithNibName:@"NewsTableController" bundle:nil]; [self presentViewController:newsTableController animated:YES completion:nil]; break; } case 0: //提示错误信息 case -1: { UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"错误" message:error.errorMessage delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; break; } } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
以上代码的逻辑应该算是简单的,将用户名、密码作为ASIFromDataRequest:requestWithURL方法的参数,想服务器发送请求。服务器会返回一个ASIHTTPRequest对象,这个ASIHTTPRequest对象会包含与登录相关的xml数据。解析它,然后根据解析得到的信息,决定是提示异常还是跳转界面。
除此之外,还需要注意账号信息的安全,如果使用UserDefault对账号信息进行保存,则需要对数据进行加密处理。这里使用AES算法加密
程序运行效果:
上面的工程项目只是简单的从OSChina中抽取代码,导入了AES加密、XML解析部分代码。本来想写一个评论列表的,后来发现如果添加这个评论列表的话,设计到的东西太多了。只怕会弄得很乱,就作罢了,,就先这样吧。
工程地址:http://download.csdn.net/detail/u011638883/6644339
O啦~~~
转载请保留出处:http://blog.csdn.net/u011638883/article/details/17068801
谢谢!!