建议先大致看一遍再斟酌用哪种方法
最近在重构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基础从入门到精通自学视频教程!