黑客技术 点击右侧关注,了解黑客的世界!
Linux编程 点击右侧关注,免费入门到精通!
建议先大致看一遍再斟酌用哪种方法
最近在重构App。旧的版本登录模块没有自动登录功能,体验极其不好。网上搜索了很多教程都没找到完整的,故写篇文章梳理一下。
难点一 审核问题
如果App首次启动后,加载的是登录界面,并且必须要登录才能进行其他操作,那么审核将会是个问题。本文不涉及这方面的知识(反正这App打包工程师是FAFA,留给他头疼)。网上涉及这方面的文章挺多的,之前粗略了解过,最好提供测试账号,并且提供测试视频到美国能直接看的视频网站。
难点二 业务逻辑问题。
有两种实现方法。
第一种比较低级的。每次App启动都进入登录界面,如果之前设置了自动登录,就调用登录按钮的方法。实现起来比较简单。
第二种是仿WX的,也是现在的主流App采用的。如果之前登录成功过并且没有退出账号,那么下次打开App就进入功能主界面,不进入登录界面。
还有用来记录登录状态的flag状态的改变(最后总结说)。
难点三 ?第二种方法中的登录令牌 token
token是用来判断当前用户的登录状态!
难点四 本地密码加密(最后发现自动登录可以不需要保存密码)
Demo链接 https://github.com/Hsusue/iOS-AutoLogin
该Demo基于第二种方法,包含了界面逻辑、加密演示、token工具包。
第一种差不多且比较简单,以下会贴出代码。
演示自动登录
HSUUserDefault.m封装了UserDefault的方法
+(void)saveUserDefaultObject:(id)object key:(NSString *)key{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:object forKey:key]; [defaults synchronize];}+(id)getUserDefaultObject:(NSString *)key{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; id tempObject = [defaults objectForKey:key]; return tempObject;}+(void)removeObjectWithKey:(NSString *)key{ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:key]; [defaults synchronize];}
AppDelage.m中 ,设置根控制器为登录控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; LoginVC *vc = [[LoginVC alloc] init]; self.window.rootViewController = vc; [self.window makeKeyAndVisible]; return YES;}
登录控制器中 根据之前的设置 布置UI 若自动登录YES , 触发登录按钮方法
- (void)viewDidLoad { self.userNameTextField.text = [HSUUserDefault getUserDefaultObject:kUserName]; BOOL isRemember = [[HSUUserDefault getUserDefaultObject:kRememberPassword] boolValue]; self.rememberSwitch.on = isRemember; if (isRemember) { self.psdTextField.text = [HSUUserDefault getUserDefaultObject:kUserPassword]; } BOOL isAutoLogin = self.autoLoginSwitch.on; if (isAutoLogin) { [self loginBtnClick]; }}
登录成功回调方法里 保存数据 切换程序根控制器
- (void)loginSuccess { [HSUUserDefault saveUserDefaultObject:self.userNameTextField.text key:kUserName]; BOOL isAutoLogin = self.autoLoginSwitch.on; if (isAutoLogin) { [HSUUserDefault saveUserDefaultObject:@(YES) key:kAutoLogin]; [HSUUserDefault saveUserDefaultObject:@(YES) key:kRememberPassword]; [HSUUserDefault saveUserDefaultObject:self.psdTextField.text key:kUserPassword]; } else { // 不自动登录 [HSUUserDefault saveUserDefaultObject:@(NO) key:kAutoLogin]; BOOL isRememberPsd = self.rememberSwitch.on; if (isRememberPsd) { // 记住密码 [HSUUserDefault saveUserDefaultObject:@(YES) key:kRememberPassword]; [HSUUserDefault saveUserDefaultObject:self.psdTextField.text key:kUserPassword]; } else { [HSUUserDefault saveUserDefaultObject:@(NO) key:kRememberPassword]; [HSUUserDefault saveUserDefaultObject:nil key:kUserPassword]; } } // 切换AppDelegate的控制器 HSUTabBarController *tabBarController = [[HSUTabBarController alloc] init]; AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; appDelegate.tabBarCtl = tabBarController; appDelegate.window.rootViewController = appDelegate.tabBarCtl;}
在注销账号的方法中 自动登录设为NO 切换程序根控制器
[HSUUserDefault saveUserDefaultObject:@(NO) key:kAutoLogin]; AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; appDelegate.tabBarCtl = nil; LoginVC *loginVC = [[LoginVC alloc] init]; appDelegate.window.rootViewController = loginVC;
在appDelegate.m中 根据是否自动登录 设置程序根控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; BOOL isAutoLogin = [[HSUUserDefault getUserDefaultObject:kAutoLogin] boolValue]; if (isAutoLogin) { // 自动登录 进入主界面 self.tabBarCtl = [[HSUTabBarController alloc] init]; self.window.rootViewController = self.tabBarCtl; } else { // 进入登录界面 LoginVC *vc = [[LoginVC alloc] init]; self.window.rootViewController = vc; } [self.window makeKeyAndVisible]; return YES;}
先讲到这,这样看第二种方法是种伪自动登录,当然可以在AppDelegate.m中发起登录请求,但是会怪怪的。
// AppDelegate.m if (isAutoLogin) { // 自动登录 进入主界面 self.tabBarCtl = [[HSUTabBarController alloc] init]; self.window.rootViewController = self.tabBarCtl; [self.tabBarCtl autoLogin]; }// HSUTabBarController.m中 实现API代理方法- (void)loginSuccess { // 这里就不需要设置自动登录什么的了 // 处理返回的数据}- (void)loginFailure {// 密码错误什么的 // 设置自动登录和记住密码为NO 密码为nil // AlertCtl显示按钮 程序根控制器置回登录控制器}
第一种实质上每次都会调用登录API,而第二种正规的做法则要根据token来判断发起什么请求。
【无门槛免费领】
535G超强程序员编程
0基础从入门到精通自学视频教程!
万水千山总是情,点个 “ 在看” 行不行