最近在做个金融项目,对进入应用会有身份验证,之前用的都是手势解锁。现在用过支付宝后,发现指纹解锁挺棒的,所以想尝试换成这个功能,而且ios8也开放了这个API,所以做起来也不难。
先看下效果图。
1、先新建一个UIViewController吧,主要就是解锁界面搭建。
简单来说,就是进入应用时,如果需要验证,就present这个控制器,验证成功就dismiss这个控制器。
代码用了masonry框架,很优秀的autolayout框架,请自行导入。
// // BYUseTouchIDViewController.m// // Created by Sunny on 15/8/10. // Copyright (c) 2015年 byzk. All rights reserved. // #import "BYUseTouchIDViewController.h" @interface BYUseTouchIDViewController () @end @implementation BYUseTouchIDViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; [self setTouchID]; } - (void)viewDidAppear:(BOOL)animated { [self evaluatePolicy]; } - (void)setTouchID { UIImageView *contentImage = [[UIImageView alloc] init]; contentImage.userInteractionEnabled = YES; contentImage.contentMode = UIViewContentModeScaleAspectFill; contentImage.image = [UIImage imageNamed:@"sky"]; [self.view addSubview:contentImage]; UIImage *touchIDImg = [UIImage imageNamed:@"touchID"]; UIButton *button = [[UIButton alloc] init]; [button setImage:touchIDImg forState:UIControlStateNormal]; [button addTarget:self action:@selector(evaluatePolicy) forControlEvents:UIControlEventTouchUpInside]; [contentImage addSubview:button]; UIButton *touchBtn = [[UIButton alloc] init]; touchBtn.backgroundColor = [UIColor clearColor]; [touchBtn setTitle:@"点击进行指纹解锁" forState:UIControlStateNormal]; [touchBtn setTitleColor:BYColor(5, 148, 223) forState:UIControlStateNormal]; touchBtn.titleLabel.font = [UIFont systemFontOfSize:16]; [touchBtn addTarget:self action:@selector(evaluatePolicy) forControlEvents:UIControlEventTouchUpInside]; [contentImage addSubview:touchBtn]; UIButton *loginBtn = [[UIButton alloc] init]; loginBtn.backgroundColor = [UIColor clearColor]; [loginBtn setTitle:@"登录其他账户" forState:UIControlStateNormal]; [loginBtn setTitleColor:BYColor(22, 96, 140) forState:UIControlStateNormal]; loginBtn.titleLabel.font = [UIFont systemFontOfSize:16]; [loginBtn addTarget:self action:@selector(loginOther) forControlEvents:UIControlEventTouchUpInside]; [contentImage addSubview:loginBtn]; [contentImage mas_makeConstraints:^(MASConstraintMaker *make) { make.left.mas_equalTo(self.view.mas_left).offset(0); make.top.mas_equalTo(self.view.mas_top).offset(0); make.right.mas_equalTo(self.view.mas_right).offset(0); make.bottom.mas_equalTo(self.view.mas_bottom).offset(0); }]; [button mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(contentImage); make.size.mas_equalTo(touchIDImg.size); }]; [touchBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(contentImage.mas_centerX); make.top.mas_equalTo(button.mas_bottom).offset(20); }]; [loginBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(contentImage.mas_centerX); make.bottom.mas_equalTo(contentImage.mas_bottom).offset(-20); }]; } //进入解锁 - (void)evaluatePolicy { LAContext *context = [[LAContext alloc] init]; // show the authentication UI with our reason string [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"通过Home键验证已有手机指纹", nil) reply: ^(BOOL success, NSError *authenticationError) { if (success) { //解锁成功就dismiss这个控制器 [self dismissViewControllerAnimated:NO completion:nil]; } }]; } - (void)loginOther { //登陆其他账户 } @end
2、然后来到AppDelegate代理
分析一下支付宝的验证模式。当用户打开应用的时候,进行验证。当应用挂入后台,再进入应用,如果这个时间差大于两分钟(我也不能明确几分钟,就当是两分钟吧)进行验证。
所以在AppDelegate.m中进行设置。
先贴出用到的几个工具类方法
// // BYTools.m // // Created by Sunny on 15/8/4. // Copyright (c) 2015年 byzk. All rights reserved. // #import "BYTools.h" @implementation BYTools //这个方法用于验证touchID是否可用 + (BOOL)canEvaluatePolicy { LAContext *context = [[LAContext alloc] init]; NSError *error; BOOL success; success = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]; return success; } //这个方法用于获取当前时间戳 + (long long)getNowTime { UInt64 nowTime = [[NSDate date] timeIntervalSince1970]; return nowTime; } @end
//AppDelegate.m //这个方法用来保存时间到本地 - (void)saveTime { NSString *nowTime = [NSString stringWithFormat:@"%lld", [BYTools getNowTime]]; NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:nowTime forKey:@"enterbgTime"]; } /** 进入后台 **/ - (void)applicationDidEnterBackground:(UIApplication *)application { //进入后台时,我们把这个时间保存下来。 [self saveTime]; } //显示touchID验证界面 - (void)showTouchID { if ([BYTools canEvaluatePolicy]) { BYUseTouchIDViewController *useTouchID = [[BYUseTouchIDViewController alloc] init]; [self.window.rootViewController presentViewController:useTouchID animated:NO completion:nil]; } } //判断是否需要进行touchID身份验证 - (void)useTouchID { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *enterbgTime = [userDefaults objectForKey:@"enterbgTime"]; if (enterbgTime.length != 0) { long long bgTime = enterbgTime.longLongValue; long long instanceTime = [BYTools getNowTime] - bgTime; if (instanceTime > 120) { [self saveTime]; [self showTouchID]; } } } //在应用被激活时调用。通常进入应用时,或者从后台进入前台时使用 - (void)applicationDidBecomeActive:(UIApplication *)application { [self useTouchID]; } //在进入应用时使用验证 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //保存时间,防止重复调用 [self saveTime]; [self showTouchID]; }
好了,基本功能就实现,当然功能还可以继续扩展或优化。
放图片资源,从支付宝ipa里找的
sky@2x.png
touchID@2x.png