|
经常使用支付宝的的指纹登录,既安全,又方便。抽空就结合着指纹的相关知识,理了一下这个流程。
在梳理支付宝指纹流程之前,先熟悉一下关于指纹解锁的知识。
指纹解锁的相关类位于 LocalAuthentication.framework 。这个库内容比较少,所以不是很复杂。主要方法如下
判断 TouchID 或者手机密码是否可用
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
其中:LAPolicy 是个枚举 :
LAPolicyDeviceOwnerAuthenticationWithBiometrics
指纹验证,三次验证不成功 就会自动取消验证
注:这个时候可以再次被调起,但如果依然验证不通过,TouchID则会被锁定。
和
LAPolicyDeviceOwnerAuthentication
两次指纹匹配不成功,会自动弹出输入密码界面。
注:当上面的TouchID多次不匹配,被锁定,无法调起的时候,我们可以调这个,会直接弹出输入密码的界面。
而 Error 里包含的是错误码。通过error.code获取。
我们常用的,也是比较重要的,有这两个code。(其他的具体可以参考 LAError 类)
LAErrorAuthenticationFailed -1
LAErrorTouchIDLockout -8
其中:
“-1”代表授权失败(当我们的指纹三次没有匹配成功的时候)。
“-8”代表TouchID被锁定。(当返回“-1”后,我们再次掉起指纹验证,再次不匹配)
注:对于一个App,并不是只有在返回“-1”之后才会返回“-8”。因为TouchID可能因为其他App无法验证被锁定,而导致我们的App直接返回“-8”。
属性
localizedCancelTitle:ALertView的左边标题 默认是取消
localizedFallbackTitle :ALertView的右边标题 (一般设置为账号密码登录)
在代码实现前,先分析一些支付宝指纹登录的流程。如图所示:

主要代码实现:
导入头文件
#import <LocalAuthentication/LocalAuthentication.h>
初始化
self.context = [[LAContext alloc] init]
self.context.localizedCancelTitle = @"取消"
self.context.localizedFallbackTitle = @"使用密码登录"
[self loginWithTouchID]
.
单纯的使用TouchID登录,如果反复无法通过,就禁止再次使用TouchID。
- (void)loginWithTouchID{
NSError *error = nil;
BOOL touchIDEnable =[self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
if (touchIDEnable) {
[self.context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"通过Home键验证已有手机指纹" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
}else{
if (error.code == LAErrorAuthenticationFailed) {
}
if (error.code == LAErrorTouchIDLockout) {
[self loginWithPhonePassword];
}
}
}];
}else{
[self loginWithPhonePassword];
}
}
.
如果TouchID没有被锁定,会先弹出两次TouchID验证。都不通过的时候,会自动弹出输入iphone密码的界面。
- (void)loginWithToucOrPhonePassword{
NSError *error = nil;
BOOL enable =[self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];
if (enable) {
[self.context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"通过Home键验证已有手机指纹" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
}else{
NSLog(@"%ld",error.code);
}
}];
}else{
NSLog(@"%ld",error.code);
}
}
另外,如果我们在设置中添加了新的TouchID,支付宝启动并没有做特别的变化。但在支付的时候,会检测到这一行为,让你手动输入支付密码。
那么,当添加了新的TouchID时,为了安全,我们可能会取消App的指纹登录,采用App的普通账号密码登录,能实现么?当然是可以的。
苹果提供了检测更新的字段:
evaluatedPolicyDomainState
在我们通过
[self.context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
检测TouchID是否可用后,
我们可以通过 self.evaluatedPolicyDomainState 获取当前的一串这样的NSData:
<3a6ebca2 b5366980 5c5a18e1 831f1f23 bff38c84 13fe93bc a305ef57 1a0efa2c>
然后把它保存到起来,下次在获取到的时候,进行对比。如果不一样,则代表指纹发生了变化。
|