关于APP后登录的实现思路分析

作者: 天清水蓝 | 来源:发表于2016-07-22 01:30 被阅读446次

    前言

    目前APP登录有两种方式:

    1. 启动程序后必须先登录,成功后才能进入主界面
    2. 先进入主界面,当用户动作触发个人信息的时候才去登录

    写这篇文章着重于分析第二种情况的实现思路,以及实现的几种方式

    实现思路

    实现后登,就需要把登录的信息存储到本地,当需要判断是否登录的时候,本地本地的个人登录数据来做判断。需要登录,模态出登录的页面,本人简单的做了个相关的demo

    1. 最传统的实现方式,附上相关代码:

       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个地方都需要,那岂不是好多冗余的代码!!!好吧,做个改进版。。。

    2. 采用继承的思想,把相关代码封装到基类【baseViewController&&baseTableViewController】

    abc.png

    好吧,算是升华了一级吧,具体使用的时候,只需要关注登录后的代码 即可

           if ([self isCheckingLogined]) {
               
               [self performSegueWithIdentifier:@"myRecordSegue" sender:nil];
           }
    

    当然,这种实现,通用可以用类别实现,用类别的话,只需要写UIViewController的类别即可

    好像已经解决了繁琐的代码,似乎完美了,不过,为毛我点了收藏按钮,登录之后,好像我还得再点一次才能收藏成功,好麻烦的赶脚。还有,我有些 地方取消登录了,要告知具体的地方,或许要做一些其他的操作。

    实现方式有两种,代理和block。

    1. 用block把登陆或者取消登录操作告知具体的页面

      @interface LoginViewController : BaseViewController
      
      @property (nonatomic, copy) ZCBasicBlock loginOkBlock;
      @property (nonatomic, copy) ZCBasicBlock loginCancelBlock;
      
      @end
      

    loginCancelBlock调用时机,是在取消登录[关闭登录页面]的时候调用
    loginOkBlock调用时机,是在登录成功的时候调用,具体代码就不赘述,详细参考demo

    依旧采用继承的方式

    bcd.png

    具体使用的地方,也很简单

        [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];
    
    cde.png

    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
    对于文章中有意见的,欢迎交流!

    相关文章

      网友评论

      • 灵界小灵:大赞:+1:
      • csqingyang:问一个思路: 点击 tabBarItem 时, 需要判断是否登录, 如果没有登录, 则 present 出登录页面, 此时如果取消登录, 则出现的页面还是之前的页面. 这个有什么好的实践吗?
        除了 重写 tabbar 的代理方法, 并在登录处理时发送通知, 有没有其他的方法?
      • pelsor:很实用:+1:
        天清水蓝:@pelsor :sunglasses:谢谢支持

      本文标题:关于APP后登录的实现思路分析

      本文链接:https://www.haomeiwen.com/subject/ajfijttx.html