wxr
2020-06-15 b8e94316e41eba72d927d5ca7d931b26139ee8ff
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
//
//  HDLTouchID.m
//  TDTouchID
//
//  Created by HDL on 2019/8/22.
//  Copyright © 2019 TuDou. All rights reserved.
//
 
#import "HDLTouchID.h"
 
 
 
@implementation HDLTouchID
 
+ (instancetype)sharedInstance {
    static HDLTouchID *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[HDLTouchID alloc] init];
    });
    return instance;
}
 
- (void)HDL_showTouchIDWithDescribe:(NSString *)descTitle  mlocalizedReason:(NSString *)mlocalizedReason blockState:(StateBlock)block {
    
    if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"系统版本不支持TouchID(必须高于iOS 8.0才能使用)");
            block(HDLTouchIDStateVersionNotSupport, nil);
        });
        
        return;
    }
    
    
    LAContext *context = [[LAContext alloc] init];
    
    context.localizedFallbackTitle = descTitle == nil ? @"输入密码验证":descTitle;
    NSError *error = nil;
    
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:mlocalizedReason == nil ? @"通过Home键验证已有指纹":mlocalizedReason reply:^(BOOL success, NSError * _Nullable error) {
            if (success) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"TouchID 验证成功");
                    block(HDLTouchIDStateSuccess, error);
                });
            } else if (error) {
                
                switch (error.code) {
                    case LAErrorAuthenticationFailed: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 验证失败");
                            block(HDLTouchIDStateFail, error);
                        });
                        break;
                    }
                    case LAErrorUserCancel: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 被用户手动取消");
                            block(HDLTouchIDStateUserCancel, error);
                        });
                    }
                        break;
                    case LAErrorUserFallback: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"用户不使用TouchID,选择手动输入密码");
                            block(HDLTouchIDStateInputPassword, error);
                        });
                    }
                        break;
                    case LAErrorSystemCancel: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 被系统取消(如遇到来电,锁屏,按了Home键等)");
                            block(HDLTouchIDStateSystemCancel, error);
                        });
                    }
                        break;
                    case LAErrorPasscodeNotSet: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 无法启动,因为用户没有设置密码");
                            block(HDLTouchIDStatePasswordNotSet, error);
                        });
                    }
                        break;
                    case LAErrorTouchIDNotEnrolled: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 无法启动,因为用户没有设置TouchID");
                            block(HDLTouchIDStateTouchIDNotSet, error);
                        });
                    }
                        break;
                    case LAErrorTouchIDNotAvailable: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 无效");
                            block(HDLTouchIDStateTouchIDNotAvailable, error);
                        });
                    }
                        break;
                    case LAErrorTouchIDLockout: {
                        
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"TouchID 无效");
                            block(HDLTouchIDStateTouchIDLockout, error);
                        });
                        
                    }
                        break;
                    case LAErrorAppCancel: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"当前软件被挂起并取消了授权(如App进入了后台等)");
                            block(HDLTouchIDStateAppCancel, error);
                        });
                    }
                        break;
                    case LAErrorInvalidContext: {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            NSLog(@"当前软件被挂起并取消了授权(LAContext对象无效)");
                            block(HDLTouchIDStateInvalidContext, error);
                        });
                    }
                        break;
                    default:
                        break;
                }
            }
        }];
    } else {
//        [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"用来验证指纹!" reply:^(BOOL success, NSError * _Nullable error) {
//            if (success) {
//                dispatch_async(dispatch_get_main_queue(), ^{
//                    block(HDLTouchIDStateSuccess,error);
//                });
//            } else {
//                dispatch_async(dispatch_get_main_queue(), ^{
//                    block(HDLTouchIDStateFail,error);
//                });
//            }
//        }];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"当前设备不支持TouchID");
            block(HDLTouchIDStateNotSupport,error);
        });
        
    }
}
 
- (void)HDL_showFaceIDWithDescribe:(NSString *)mlocalizedReason blockState:(faceIDStateBlock)block {
    NSError *error;
    
    LAContext *context = [[LAContext alloc] init];
    
    BOOL canAuthentication = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];
    if (canAuthentication) {
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:mlocalizedReason reply:^(BOOL success, NSError * _Nullable error) {
            //注意iOS 11.3之后需要配置Info.plist权限才可以通过Face ID验证哦!不然只能输密码啦...
            if (success) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    block(HDLFaceIDStateSuccess,error);
                });
            } else {
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"当前软件被挂起并取消了授权(如App进入了后台等)");
                    block(HDLFaceIDStateFail,error);
                });
            }
        }];
    }
}
 
 
// 判断设备支持哪种认证方式 TouchID & FaceID
- (HDLTouchIDSupperType) HDL_canSupperBiometrics {
    LAContext *context = [[LAContext alloc] init];
    NSError *error;
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        if (error != nil) {
            return HDLTouchIDSupperTypeNone;
        }
        if (@available(iOS 11.0, *)) {
            return context.biometryType == LABiometryTypeFaceID ? HDLTouchIDSupperTypeFaceID : HDLTouchIDSupperTypeTouchID;
        }
    }
    return HDLTouchIDSupperTypeNone;
}
 
 
@end