iOS 实现自动登录(从低级做法到高级做法)

    xiaoxiao2022-07-02  222

    黑客技术 点击右侧关注,了解黑客的世界!

    Linux编程 点击右侧关注,免费入门到精通!

    建议先大致看一遍再斟酌用哪种方法

    前言

    最近在重构App。旧的版本登录模块没有自动登录功能,体验极其不好。网上搜索了很多教程都没找到完整的,故写篇文章梳理一下。

    难点一  审核问题

    如果App首次启动后,加载的是登录界面,并且必须要登录才能进行其他操作,那么审核将会是个问题。本文不涉及这方面的知识(反正这App打包工程师是FAFA,留给他头疼)。网上涉及这方面的文章挺多的,之前粗略了解过,最好提供测试账号,并且提供测试视频到美国能直接看的视频网站。

    难点二  业务逻辑问题。

    有两种实现方法。

    第一种比较低级的。每次App启动都进入登录界面,如果之前设置了自动登录,就调用登录按钮的方法。实现起来比较简单。

    第二种是仿WX的,也是现在的主流App采用的。如果之前登录成功过并且没有退出账号,那么下次打开App就进入功能主界面,不进入登录界面。

    还有用来记录登录状态的flag状态的改变(最后总结说)。

    难点三  ?第二种方法中的登录令牌 token

    token是用来判断当前用户的登录状态!

    难点四  本地密码加密(最后发现自动登录可以不需要保存密码)

    先不考虑加密 用UserDefault保存

    Demo链接 https://github.com/Hsusue/iOS-AutoLogin

    该Demo基于第二种方法,包含了界面逻辑、加密演示、token工具包。

    第一种差不多且比较简单,以下会贴出代码。

    演示自动登录

    第一种low的方法

    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基础从入门到精通自学视频教程!

     

      

      

      

       

    万水千山总是情,点个 “ 在看” 行不行
    最新回复(0)