一、软硬件支持
指纹验证功能的最低硬件支持为iPhone5s, iPad 6,iPad mini 3这些有touch ID硬件支持的设备,并且操作系统最低为iOS8.0,因为touch ID是在iOS8.0之后才开放的一类api,实现了指纹验证的功能。
二、程序实现
指纹解锁该功能实现起来是很简单的,因为苹果都已经帮我们封装好了,只需要实现几个方法就可以了。
实现流程:
step1: 引入依赖框架(指纹解锁必须的头文件):
1
|
#import <LocalAuthentication/LocalAuthentication.h>
|
step2: 指纹验证的实现的两个主要方法:
这个方法是判断设备是否支持TouchID的。
1
2
|
- (
BOOL
)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)
error __attribute__((swift_error(none)));
|
这个是用来验证TouchID的,会有弹出框出来。
1
2
3
|
- (
void
)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(
void
(^)(
BOOL
success, NSError * __nullable error))reply;
|
step3: 主要回调方法:
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
|
typedef
NS_ENUM(NSInteger, LAError)
{
// 授权失败
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
// 用户取消Touch ID授权
LAErrorUserCancel = kLAErrorUserCancel,
// 用户选择输入密码
LAErrorUserFallback = kLAErrorUserFallback,
// 系统取消授权(例如其他APP切入)
LAErrorSystemCancel = kLAErrorSystemCancel,
// 系统未设置密码
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
// 设备Touch ID不可用,例如未打开
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
// 设备Touch ID不可用,例如未打开
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
// 触摸ID现在锁定 验证是不成功的,因为有太多的失败的尝试和触摸ID
LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAErrorTouchIDLockout,
// 认证被取消的应用(如无效而认证进行调用)。
LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
/// LAContext passed to this call has been previously invalidated.
// LAContext通过这个电话已经失效
LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
}
|
验证指纹:
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
|
- (
void
)authenticateUser {
//创建LAContext
LAContext *context = [[LAContext alloc] init];
// 这个属性是设置指纹输入失败之后的弹出框的选项
context.localizedFallbackTitle = @
"请输入密码"
;
NSError *error = nil;
if
([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
NSLog(@
"支持指纹识别"
);
// localizedReason: 用于设置提示语,表示为什么要使用Touch ID
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@
"请按home键指纹解锁"
reply:^(
BOOL
success, NSError * _Nullable error) {
if
(success) {
dispatch_sync(dispatch_get_main_queue(), ^{
// Update UI in UI thread here
NSLog(@
"验证成功 刷新主界面"
);
});
}
else
{
NSLog(@
"%@"
,error.localizedDescription);
switch
(error.code) {
case
LAErrorSystemCancel:
{
NSLog(@
"系统取消授权,如其他APP切入"
);
break
;
}
case
LAErrorUserCancel:
{
NSLog(@
"用户取消验证Touch ID"
);
break
;
}
case
LAErrorAuthenticationFailed:
{
NSLog(@
"授权失败"
);
break
;
}
case
LAErrorPasscodeNotSet:
{
NSLog(@
"系统未设置密码"
);
break
;
}
case
LAErrorTouchIDNotAvailable:
{
NSLog(@
"设备Touch ID不可用,例如未打开"
);
break
;
}
case
LAErrorTouchIDNotEnrolled:
{
NSLog(@
"设备Touch ID不可用,用户未录入"
);
break
;
}
case
LAErrorUserFallback:
// 用于设置左边的按钮的名称,默认是Enter Password
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@
"用户选择输入密码,切换主线程处理"
);
}];
break
;
}
default
:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@
"其他情况,切换主线程处理"
);
}];
break
;
}
}
}
}];
}
else
{
NSLog(@
"不支持指纹识别"
);
switch
(error.code) {
case
LAErrorTouchIDNotEnrolled:
{
NSLog(@
"TouchID is not enrolled"
);
break
;
}
case
LAErrorPasscodeNotSet:
{
NSLog(@
"A passcode has not been set"
);
break
;
}
default
:
{
NSLog(@
"TouchID not available"
);
break
;
}
}
NSLog(@
"%@"
,error.localizedDescription);
}
}
|
项目中若有了指纹解锁这种解锁方式, 瞬间有木有觉得自己的项目高大上了一丢丢呢。
三、压缩文件截图及运行效果
1、压缩文件的截图
2、运行效果的截图
四、其他补充
界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行!
如需看源码,请点击这里下载!