离发 IOS项目实战-登录解析 这篇博客有差不多一周了。也看到有朋友评论要把doLogin的代码补上来,因为我也是新手,所以在学习中写博客,效率是慢了点,同样在写例子的时候也碰到很多问题。也就都一起记录下来,就不会在犯同样的错误了。
这里请求网络服务器会用到第三方的框架ASIHttpRequest,该框架在CFNetwork.framework上进行了封装,让我在开发网络应用的时候更加便捷,所以当然要先添加这个框架到项目中。
下载地址:http://www.oschina.net/p/asihttprequest
在下载的文件中,会用到下图中的类
添加到项目中后,第一个错误就出现了,因为是ARC的项目,把上面的类一贴到项目中就报了ARC的错误
第一步:修改ASI的类为 -fno-objc-arc 就可以解决ARC的错误问题
第二步:引入几个主要的framework
1、CFNetwork.framework
2、MobileCoreServices.framework
3、SystemConfiguration.framework
4、libz.1.2.5.dylib
这几个包是一定要引入的,不然Xcode也会报出异常的。
第三步:修改Header Search Paths 和 Other Linker Flags
所有设置都搞定了,就要想一想调用doLogin时都要做些什么了。
1、在用户点击登录时,先在本地验证账号、密码是否合法,减轻每次都去请求服务器照成的网络访问
2、登录错误后,给予用户正确的提示信息
3、登录成功后,跳到需要显示给用户的首页面,并且在本地保存用户信息,以便下次登录
直接贴代码吧,代码里面有详细的注释,因为没有远程服务器做测试,所以借用了 @红薯 大哥的OsChina做测试,@红薯大哥千万别生气哦。
// 登陆 - (void)doLogin { bool isSwitch = true; NSString *errorMessage = @""; NSString *name = self.nameField.text; NSString *pwd = self.pwdField.text; // 验证用户不为nil且不为空的字符串 if (!name || [name isEqualToString:@""]) { isSwitch = false; errorMessage = @"账号不能为空"; } // 验证密码不为nil且不为空的字符串 else if (!pwd || [pwd isEqualToString:@""]) { isSwitch = false; errorMessage = @"密码不能为空"; } // 如果isSwitch不为true,说明本地的验证没有通过 if (!isSwitch) { // show出alert提示用户 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" message:errorMessage delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil]; [alertView show]; } else { // 通过验证请求服务器 NSURL *url = [NSURL URLWithString:api_login_validate]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request setPostValue:name forKey:@"username"]; [request setPostValue:pwd forKey:@"pwd"]; [request setPostValue:@"1" forKey:@"keep_login"]; [request startSynchronous]; NSError *error = [request error]; if (!error) { // 服务器返回数据,解析数据,成功跳转,失败提示用户 NSString *response = [request responseString]; NSLog(@"%@", response); } } }关于返回类型的解析,OsChina返回的是XML文件,OsChina的客户端是用到TBXML这个来解析的。
如果服务器返回的Josn的话,可以通过SBJson或其它IOS的第三方Json框架来解析。
登录的业务处理,解析,保存Cookie等操作,可以写一个工具类来封装,因为在其它的模块可能会验证用户是否登录或取用户的信息等,因为是Demo,没有封装这些操作。