目前应用基本都有登录选项,就是登录的时机不同而已。主流的两种登录场景:第一种是一进入就判断你是否登录(就是你不先登录你就不能用);第二种是当你点击某一项或者使用某个功能时才提醒你登录。
第一种:加载完LaunchImage后直接加载登录界面,登录成功后显示主界面。(PS:这种情况可能会遇到上线被拒,因为你应用里面有部分直接展示的内容不需要关联用户)
做法是切换keyWindow的rootViewController,通常用通知、代理以及获取单例的UIApplication利用AppDelegate这些方法。个人感觉利用UIApplication最为方便,下面就是这种做法介绍
启动应用在- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions里面进行用户是否登录判断,这里的登录状态保存在NSUserDefaults中
BOOL loginState = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginState"];
loginState ? [self changeAPPRootViewControllerToTabbar]:[self changeAPPRootViewControllerToLogin];
设置登录界面为应用的主界面
#pragma mark - 切换为登录界面
- (void)changeAPPRootViewControllerToLogin {
LNLoginViewController *loginVC = [[LNLoginViewController alloc] init];
loginVC.title = @"Login";
// loginVC.delegate = self;
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:loginVC];
self.window.rootViewController = navi;
}
设置业务界面
#pragma mark - 切换为显示tabbar界面
- (void)changeAPPRootViewControllerToTabbar {
LNTabbarController *tabbarController = [[LNTabbarController alloc] init];
self.window.rootViewController = tabbarController;
}
注意:这两个方法一定要在AppDelegate.h中声明。
好的,接下来就是处理登录和退出操作了。
登录成功切换为业务界面
- (void)login {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"loginState"];
[[NSUserDefaults standardUserDefaults] synchronize];
// [self.delegate changeAPPRootViewControllerToTabbar];
if ([[[UIApplication sharedApplication] delegate] respondsToSelector:@selector(changeAPPRootViewControllerToTabbar)]) {
[[UIApplication sharedApplication].delegate performSelector:@selector(changeAPPRootViewControllerToTabbar)];
}
}
退出成功切换为登录界面
- (void)logout {
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"loginState"];
[[NSUserDefaults standardUserDefaults] synchronize];
if ([[[UIApplication sharedApplication] delegate] respondsToSelector:@selector(changeAPPRootViewControllerToLogin)]) {
[[UIApplication sharedApplication].delegate performSelector:@selector(changeAPPRootViewControllerToLogin)];
}
}
大致思路就是这样的,只要在添加登录成功或退出成功的相应处理就好了。
第二种:主界面以UITabbarController或者UINavigationController形式展示,当点击tabbar的某一项时present出来登录界面,或者使用某一项功能时push出来登录界面。
这种做法主要是利用UITabBarControllerDelegate中的- (BOOL)tabBarController:(UITabBarController )tabBarController shouldSelectViewController:(UIViewController )viewController这个代理方法,我们可以根据需求去设定按个tabbarItem对应的界面显示需要登录。
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
self.clickedTag = viewController.tabBarItem.tag;
if (viewController.tabBarItem.tag == 1) {
BOOL loginState = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginState"];
loginState ? : [self presentLoginController];
return loginState;
}
return YES;
}
登录成功后利用selectedIndex改变tabbarController当前显示的界面。
self.selectedIndex = self.clickedTag;