前言
目前APP登录有两种方式:
- 启动程序后必须先登录,成功后才能进入主界面
- 先进入主界面,当用户动作触发个人信息的时候才去登录
写这篇文章着重于分析第二种情况的实现思路,以及实现的几种方式
实现思路
实现后登,就需要把登录的信息存储到本地,当需要判断是否登录的时候,本地本地的个人登录数据来做判断。需要登录,模态出登录的页面,本人简单的做了个相关的demo
-
最传统的实现方式,附上相关代码:
NSString * username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"]; NSString * password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"]; if (!stringIsEmpty(username)&&!stringIsEmpty(password)) { //已登录 [self performSegueWithIdentifier:@"myRecordSegue" sender:nil]; }else{ //跳转到登陆页面 UIViewController * loginViewController = [CommonTool sbWithName:@"Main" identifier:@"LoginViewController"]; UINavigationController * navgationVC = [[UINavigationController alloc] initWithRootViewController:loginViewController]; [self presentViewController:navgationVC animated:YES completion:^{ }]; }
demo上简单的做了个本地存储,真正项目里面最好需要转成单例去做是否登录判断。好了,后登实现了。
but,but,感觉好麻烦的样子!一坨代码好长,如果应用中有N个地方都需要,那岂不是好多冗余的代码!!!好吧,做个改进版。。。 采用继承的思想,把相关代码封装到基类【baseViewController&&baseTableViewController】
好吧,算是升华了一级吧,具体使用的时候,只需要关注登录后的代码 即可
if ([self isCheckingLogined]) {
[self performSegueWithIdentifier:@"myRecordSegue" sender:nil];
}
当然,这种实现,通用可以用类别实现,用类别的话,只需要写UIViewController的类别即可
好像已经解决了繁琐的代码,似乎完美了,不过,为毛我点了收藏按钮,登录之后,好像我还得再点一次才能收藏成功,好麻烦的赶脚。还有,我有些 地方取消登录了,要告知具体的地方,或许要做一些其他的操作。
实现方式有两种,代理和block。
-
用block把登陆或者取消登录操作告知具体的页面
@interface LoginViewController : BaseViewController @property (nonatomic, copy) ZCBasicBlock loginOkBlock; @property (nonatomic, copy) ZCBasicBlock loginCancelBlock; @end
loginCancelBlock调用时机,是在取消登录[关闭登录页面]的时候调用
loginOkBlock调用时机,是在登录成功的时候调用,具体代码就不赘述,详细参考demo
依旧采用继承的方式
具体使用的地方,也很简单
[self checkLoginWithLoginedBlock:^{
NSLog(@"login sucess");
[self performSegueWithIdentifier:@"myRecordSegue" sender:nil];
} loginCancelBlock:^{
NSLog(@"cancel login");
}];
同样,这种实现方式也可以写成类别[个人推荐类别,毕竟只要写UIViewController的类别即可]
拓展
以上几种方式,基本已经能满足后登录的需求实现,不过还有一种实现思路:
可以把需要登录才能展现的页面对应的类整理起来,放到数组里面,重写导航的push方法,在这一层做个过滤,我把它称作页面拦截
,具体需要登录展现的页面,我都不用去关心到底是否登录。
FeaturedViewController * featuredVC = [[FeaturedViewController alloc] init];
//self.navigationController 是你要重写的导航类
[self.navigationController pushViewController:featuredVC animated:YES];
checkContollerIsNeedLogin实现方法如下
- (BOOL )checkContollerIsNeedLogin:(UIViewController*)controller
{
for (NSString * classString in self.needLoginsArray) {
Class tempClass = NSClassFromString(classString);
if ([controller isKindOfClass:tempClass]) {
return YES;
}
}
return NO;
}
对于点击按钮进行页面跳转的可以使用此方式,像本页面操作[点击关注,收藏等动作]可能就无法使用该功能。这个嘛就见仁见智了
代码链接:https://github.com/albertjson/LoginDemo
对于文章中有意见的,欢迎交流!