• 模仿支付宝钱包touchID功能(原创)


    最近在做个金融项目,对进入应用会有身份验证,之前用的都是手势解锁。现在用过支付宝后,发现指纹解锁挺棒的,所以想尝试换成这个功能,而且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

    sky@2x.png

    touchID@2x.png

    touchID@2x.png

  • 相关阅读:
    《超级迷宫》需求规格说明
    超级迷宫冲刺个人计划安排
    审评(HelloWorld团队)
    C语言中的++与*
    a、b交换
    微服务架构浅析及实践心得
    Servlet版本冲突引起的Error
    并发编程:一个100%会发生死锁的程序
    单元测试与Mockito
    Java基础:HashMap假死锁问题的测试、分析和总结
  • 原文地址:https://www.cnblogs.com/c-y-q/p/4744217.html
Copyright © 2020-2023  润新知