iOS 指纹登录(TouchID)集成方案

TouchID指纹识别是iPhone 5S设备中增加的一项重大功能.苹果的后续移动设备也相继添加了指纹功能,在实际使用中还是相当方便的,比如快捷登录,快捷支付等等.系统提供了相应框架,使用起来还是比较方便的.使用LAContext对象即可完成指纹识别,提高用户体验.

TouchID

提示:指纹识别必须用真机测试,并且在iOS8以上系统.

TouchID API使用

1.添加头文件

1
# import

2.判断系统版本

1
2
3
4
5
  //首先判断版本
if  (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
       NSLog(@ "系统版本不支持TouchID" );
       return ;
}

3.LAPolicy

在这里简单介绍一下LAPolicy,它是一个枚举.我们根据自己的需要选择LAPolicy,它提供两个值:

LAPolicyDeviceOwnerAuthenticationWithBiometrics和LAPolicyDeviceOwnerAuthentication.

<1>. LAPolicyDeviceOwnerAuthenticationWithBiometrics是支持iOS8以上系统,使用该设备的TouchID进行验证,当输入TouchID验证5次失败后,TouchID被锁定,只能通过锁屏后解锁设备时输入正确的解锁密码来解锁TouchID。

<2>.LAPolicyDeviceOwnerAuthentication是支持iOS9以上系统,使用该设备的TouchID或设备密码进行验证,当输入TouchID验证5次失败后,TouchID被锁定,会触发设备密码页面进行验证。

4. canEvaluatePolicy

使用canEvaluatePolicy方法判断设备是否支持TouchID,返回BOOL为YES,该设备支持TouchID。

1
  if  ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {

error为返回验证错误码.具体不解释了.

5. evaluatedPolicyDomainState

context.evaluatedPolicyDomainState用于判断设备上的指纹是否被更改,在LAContext被创建的时候,evaluatedPolicyDomainState才生效,可在TouchID验证成功时,将它记录下来,用于下次使用TouchID时校验,提高安全性。

6. evaluatePolicy

evaluatePolicy方法是对TouchID进行验证,Block回调中如果success为YES则验证成功,为NO验证失败,并对error进行解析.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
- (IBAction)loginButtonClick:(UIButton *)sender {
     
     //首先判断版本
     if  (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
         NSLog(@ "系统版本不支持TouchID" );
         return ;
     }
     
     
     LAContext *context = [[LAContext alloc] init];
     context.localizedFallbackTitle = @ "输入密码" ;
     if  (@available(iOS  10.0 , *)) {
//        context.localizedCancelTitle = @"22222";
     else  {
         // Fallback on earlier versions
     }
     NSError *error = nil;
   
     if  ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
         
         [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@ "通过Home键验证已有手机指纹"  reply:^(BOOL success, NSError * _Nullable error) {
             
             if  (success) {
                 dispatch_async(dispatch_get_main_queue(), ^{
                     NSLog(@ "TouchID 验证成功" );
                 });
             } else  if (error){
                 
                 switch  (error.code) {
                     case  LAErrorAuthenticationFailed:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 验证失败" );
                         });
                         break ;
                     }
                     case  LAErrorUserCancel:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 被用户手动取消" );
                         });
                     }
                         break ;
                     case  LAErrorUserFallback:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "用户不使用TouchID,选择手动输入密码" );
                         });
                     }
                         break ;
                     case  LAErrorSystemCancel:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)" );
                         });
                     }
                         break ;
                     case  LAErrorPasscodeNotSet:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 无法启动,因为用户没有设置密码" );
                         });
                     }
                         break ;
                     case  LAErrorTouchIDNotEnrolled:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 无法启动,因为用户没有设置TouchID" );
                         });
                     }
                         break ;
                     case  LAErrorTouchIDNotAvailable:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 无效" );
                         });
                     }
                         break ;
                     case  LAErrorTouchIDLockout:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码)" );
                         });
                     }
                         break ;
                     case  LAErrorAppCancel:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "当前软件被挂起并取消了授权 (如App进入了后台等)" );
                         });
                     }
                         break ;
                     case  LAErrorInvalidContext:{
                         dispatch_async(dispatch_get_main_queue(), ^{
                             NSLog(@ "当前软件被挂起并取消了授权 (LAContext对象无效)" );
                         });
                     }
                         break ;
                     default :
                         break ;
                 }
             }
         }];
         
     } else {
         NSLog(@ "当前设备不支持TouchID" );
     }
}

上面这个代码, 是整个TouchID的核心,也几乎是所有代码了.

验证

验证必须使用真机

结果

输入错误的时候

总结:TouchID使用起来不难,重要的是使用流程逻辑.

以登录为例,一般来说流程是这样的:

  1. 开启指纹登录:首次登陆使用密码登录,登录后,可以设置一个开启指纹ID登录的按钮,来进行指纹认证.

  2. 验证:检测是否支持TouchID.

  3. 生成设备账号/密码:TouchID验证通过后,根据当前已登录的账号和硬件设备Token,生成设备账号/密码(规则可自定,密码要长要复杂),并保存在keychain;

  4. 绑定:生成设备账号/密码后,将原账号及设备账号/密码,加密后(题主使用的是RSA加密)发送到服务端进行绑定;

  5. 成功:验证原账号及设备账号有效后,返回相应状态,绑定成功则完成整个TouchID(设备)绑定流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值