支持指纹的话必须是iPhone 5S 以上的机型,虽然iOS7以后已经有了指纹,但是貌似不对第三方程序开放,所以系统得是8.0以上的版本,因此在判断是否支持时可以这样写:
+(BOOL)canShow {
if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) {
return NO;
}
if (![[WolfFingerLock shareLock].context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]) {
return NO;
}
return YES;
}
其中第二个判断是LAContext类的判断方法,LAContext类是LocalAuthentication.framework框架中的对象,因此指纹解锁的依赖框架是LocalAuthentication.framework。判断方法中有个参数得说明一下:
- LAPolicyDeviceOwnerAuthenticationWithBiometrics
- LAPolicyDeviceOwnerAuthentication
看注释的话一大串说明,看着比较麻烦,从用法上讲两个参数的区别在于当用户点击“输入密码”的时候:第一个参数是返回在Error中,code是LAErrorUserFallback,此时程序里走用户要输入密码的逻辑,而第二个参数是用户点击“输入密码”后自动弹出iPhone手机数字密码解锁界面。也就是说,这个参数决定了用户输入密码的时候是你来控制还是交给iPhone来控制。
再看正戏:解锁过程
查了写资料有的写的很详细,但是我觉得实际开发中可能用不了那么多的判断,所以我简化了一些,先看.h文件的声明部分:
/**
唤起指纹解锁
@param needPhonePassword 用户点击面板上的“输入密码”后,YES==输入iPhone解锁密码;NO==返回失败的Block中,error code==LAErrorUserFallback;只有在iOS9.0以上版本有效
@param successed 指纹密码成功
@param failed 指纹密码失败
*/
+(void)showLockNeedPhonePassword:(BOOL)needPhonePassword OnSuccess:(Successed)successed onFail:(Failed)failed;
再看实现部分:
+(void)showLockNeedPhonePassword:(BOOL)needPhonePassword OnSuccess:(Successed)successed onFail:(Failed)failed {
NSInteger policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
if (needPhonePassword && [UIDevice currentDevice].systemVersion.floatValue > 9.0) {
policy = LAPolicyDeviceOwnerAuthentication;
}
[[WolfFingerLock shareLock].context evaluatePolicy:policy localizedReason:LOCK_SHOW_WORDS reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
successed();
} else {
failed(error);
}
}];
}
里面有些Block以及宏定义我就不说明了,或者自己写一下,或者下载我的工具,这里面我不知道在哪里上传附件,要下载的同学请移步:我的Code4app,也不知道审核通过了没。
在外部调用的时候这样写就OK:里面的Error.code都在.h文件中有说明。
if ([WolfFingerLock canShow]) {
[WolfFingerLock showLockNeedPhonePassword:YES OnSuccess:^{
//验证成功
NSLog(@"验证成功");
} onFail:^(NSError *error) {
switch (error.code) {
case LAErrorSystemCancel:
NSLog(@"LAErrorSystemCancel");
break;
case LAErrorUserCancel:
NSLog(@"LAErrorUserCancel");
break;
case LAErrorUserFallback:
NSLog(@"LAErrorUserFallback");
break;
case LAErrorPasscodeNotSet:
NSLog(@"LAErrorPasscodeNotSet");
break;
default:
break;
}
}];
}