TouchID验证这个在iOS8中已经对开发者开放使用了,而且需在5s以上真机才能使用,这个出来已经比较早了,相信很多人都应该已经知道怎么使用TouchID了,但是就目前我使用的App来说,看到使用TouchID验证的占得数量并不多,对于一些涉及到安全性的App来说,很有可能你的解锁验证、App登录以及支付验证都是用的TouchID使用TouchID验证还是有风险的,但是有些App增加使用TouchID作为一种验证还是不错的选择,既快捷又方便,对于开发者来说增加的成本也很低

这个是我所讲的demo的源码TouchID demo,代码量非常少


下面我就来介绍下怎么给App增加TouchID验证吧

首先,要使用TouchID,得先引入LocalAuthentication.framework这个库,这里面只有四个头文件,但实际使用到的只有LAContext.h和LAError.h这两个头文件

在做验证时,我们只需要使用到LAContext中的两个方法

我们先初始化一个LAContext对象

1
LAContext *ctx = [[LAContext alloc] init];

然后调用

1
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError*__autoreleasing*)error;

方法来确定当前指定的验证方法能否使用,LAPolicy是个枚举,里面只有两个值,一个是LAPolicyDeviceOwnerAuthenticationWithBiometrics(使用该设备的TouchID验证),LAPolicyDeviceOwnerAuthentication(使用该设备的TouchID和设备密码验证)

这里返回的是一个布尔值,错误处理我等下一起说明,当返回可以使用当前指定的验证法方法时,我们调用

1
- (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString*)localizedReason reply:(void(^)(BOOLsuccess,NSError*__nullableerror))reply;

方法开始使用TouchID验证,localizedReason指的是在弹出TouchID验证框时提示的文字,reply指的是在做指纹验证或者密码验证后的结果返回,我将localizedReason用@”通过Home键验证已有手机指纹”作为提示,下图比较直观

刚才布尔值的错误对应的是哪些呢?

这就用到了LAError.h这个类,这个类定义了目前所有的验证失败的错误code,我直接将它copy过来了

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
typedefNS_ENUM(NSInteger, LAError)
{
/// 校验失败
LAErrorAuthenticationFailed =kLAErrorAuthenticationFailed,

/// 用户取消验证
LAErrorUserCancel=kLAErrorUserCancel,

/// 用户回退(返回密码校验)
LAErrorUserFallback=kLAErrorUserFallback,

/// 系统取消校验
LAErrorSystemCancel=kLAErrorSystemCancel,

/// 密码未设置
LAErrorPasscodeNotSet=kLAErrorPasscodeNotSet,

/// 指纹不正确
LAErrorTouchIDNotAvailable=kLAErrorTouchIDNotAvailable,

/// 没有录入指纹
LAErrorTouchIDNotEnrolled=kLAErrorTouchIDNotEnrolled,

/// TouchID被锁定
LAErrorTouchIDLockoutNS_ENUM_AVAILABLE(10_11,9_0) =kLAErrorTouchIDLockout,

/// App取消验证
LAErrorAppCancelNS_ENUM_AVAILABLE(10_11,9_0) =kLAErrorAppCancel,

/// 无效的上下文环境
LAErrorInvalidContextNS_ENUM_AVAILABLE(10_11,9_0) =kLAErrorInvalidContext
}NS_ENUM_AVAILABLE(10_10,8_0);

而前四种error是针对于能确定使用验证后,在验证后返回的错误

后六种error是针对于不能使用验证的原因

你可以针对这些原因做一些相应的操作,比如弹窗等等