仿iOS端App超时强制登录

作者: uniapp | 来源:发表于2017-07-31 16:50 被阅读226次

    在使用银行类App时,常常会遇到超过一定时间(大约3分钟左右)后,继续操作就需要再次登录的情况,简化后如下图所示.这种设计主要是出于安全性的考虑,防止用户忘记即使退出或者手机丢失时造成的财产损失.作为开发者,该如何实现功能呢?

    loginExample
    分析

    登录成功后,展现交易模块.在模块内的任意时间,如果没有页面间的相互跳转或者应用退到后台,就认为用户意图离开App,再次使用交易模块的功能就需要再次登录确认身份.因此,可以将交易模块内的所有页面控制器继承自一个根控制器,比如命名为ZDBaseViewController.然后在其页面的viewWillAppear和viewWillDisappear的代理方法中,对用户的暂停时间进行判断.如果超过规定时间,就弹出登录界面,否者正常弹出.

    实现

    新建类ZDTimeManager,统一管理页面跳转时的时间戳.

    @interface ZDTimeManager : NSObject
    
    + (void)resetTime;
    + (BOOL)isOver;
    
    @end
    
    #define ZDTimeStamp @"ZDTimeStamp"
    //定时,以分钟为单位
    #define TimeInterval 0.1
    
    @implementation ZDTimeManager
    
    + (void)resetTime{
        NSNumber *currentTime = [NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]];
        [[NSUserDefaults standardUserDefaults] setObject:currentTime forKey:ZDTimeStamp];
        [[NSUserDefaults standardUserDefaults] synchronize];
    };
    
    + (BOOL)isOver{
        NSTimeInterval currentTime =  [[NSDate date] timeIntervalSince1970];
        NSNumber *oldTimeStamp = [[NSUserDefaults standardUserDefaults] objectForKey:ZDTimeStamp];
        //防止时间戳存储错误
        if (!oldTimeStamp) {
            [self resetTime];
        }
        NSTimeInterval oldTime = [oldTimeStamp doubleValue];
        if ((currentTime - oldTime) > TimeInterval * 60) {
            return true;
        }
        return false;
    }
    @end
    

    在ZDBaseViewController使用ZDTimeManager.

    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        
        [self compareTime];
        [ZDTimeManager resetTime];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resignActive) name:UIApplicationWillResignActiveNotification object:nil];
    }
    
    - (void)compareTime{
        ![ZDTimeManager isOver] ?  : [self jumpToLogin];
    }
    
    - (void)jumpToLogin{
        ZDLoginController *loginC = [[ZDLoginController alloc] init];
        [self.navigationController presentViewController:loginC animated:true completion:nil];
    }
    
    - (void)becomeActive{
        [self compareTime];
    }
    
    -(void)resignActive{
        [ZDTimeManager resetTime];
    }
    - (void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:animated];
        
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    最后需要在交易模块首页的viewDidLoad方法中,更新NSUerDefaults中存储的时间.

    @implementation ZDTradeController
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [ZDTimeManager resetTime];
    }
    @end
    
    详细参考loginExample

    喜欢和关注都是对我的鼓励和支持~

    相关文章

      网友评论

        本文标题:仿iOS端App超时强制登录

        本文链接:https://www.haomeiwen.com/subject/mfjrlxtx.html