在使用银行类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
喜欢和关注都是对我的鼓励和支持~
网友评论