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

640?wx_fmt=jpeg

黑客技术 点击右侧关注,了解黑客的世界! 640?wx_fmt=jpeg

640?wx_fmt=jpeg

Linux编程 点击右侧关注,免费入门到精通! 640?wx_fmt=jpeg


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


640?wx_fmt=gif前言


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


难点一  审核问题


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


难点二  业务逻辑问题。


有两种实现方法。


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


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


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


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


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


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

640?wx_fmt=gif先不考虑加密 用UserDefault保存


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


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


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


640?wx_fmt=gif

演示自动登录


第一种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显示按钮 程序根控制器置回登录控制器
}


640?wx_fmt=gif总结


第一种实质上每次都会调用登录API,而第二种正规的做法则要根据token来判断发起什么请求。



【无门槛免费领】

535G超强程序员编程

0基础从入门到精通自学视频教程!

640?wx_fmt=jpeg

640?wx_fmt=jpeg 640?wx_fmt=jpeg

640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg 640?wx_fmt=jpeg

640?wx_fmt=png万水千山总是情,点个 “ 在看” 行不行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值