验证方式
- LAPolicyDeviceOwnerAuthenticationWithBiometrics
iOS8.0以上支持,只有生物校验功能
生物校验授权使用,当设备不具有Touch ID / Face Id 功能,或者在系统设置中没有设置开启生物校验,授权将会失败。
前三次生物校验失败,生物校验框不再弹出。再次重新进入验证,还有两次验证机会,如果还是验证失败,Touch ID(Face ID)被锁住不再继续弹出生物校验框。以后的每次验证都将会弹出设备密码输入框直至输入正确的设备密码才能重新使用生物校验
- LAPolicyDeviceOwnerAuthentication
iOS 9.0以上支持,包含生物校验与输入密码的验证方式
生物校验和数字密码的授权使用,当生物校验可用且没有被锁定,授权后会进入生物校验。不然的话会进入数字密码验证的页面。当系统数字密码没有设置不可用的时候,授权失败。
生物校验失败三次将弹出设备密码输入框,如果不进行密码输入。再次进来还可以有两次机会进行生物校验,如果都失败则Touch ID(Face ID)被锁住,以后每次进来验证都是调用系统的设备密码直至输入正确的设备密码才能重新使用生物校验
验证类型
- LABiometryTypeNone / LABiometryNone
不支持生物识别
- LABiometryTypeTouchID
支持 Touch ID
- LABiometryTypeFaceID
支持 Face ID
验证错误类型
- LAErrorAuthenticationFailed
授权失败
- LAErrorUserCancel
用户取消验证Touch ID
- LAErrorUserFallback
用户选择输入密码,切换主线程处理
- LAErrorSystemCancel
系统取消授权,如其他APP切入
- LAErrorPasscodeNotSet
系统密码未设置
- LAErrorTouchIDNotAvailable
设备Touch ID不可用,例如未打开
设备不支持Touch ID/Face ID,iOS 11被标注过时,需要使用LAErrorBiometryNotAvailable代替
- LAErrorTouchIDNotEnrolled
设备Touch ID不可用,用户未录入
没有录入指纹/人脸,iOS 11被标注过时,需要使用LAErrorBiometryNotEnrolled代替
- LAErrorTouchIDLockout
设备Touch ID不可用,如多次验证失败
- LAErrorAppCancel
APP调用了- (void)invalidate 方法使 LAContext失效
- LAErrorInvalidContext
实例化的LAContext对象失效,再次调用evaluation...方法则会弹出此错误信息
- LAErrorBiometryNotAvailable
设备不支持Touch ID/Face ID,iOS 11新增,由于新增Face ID,故用来代替LAErrorTouchIDNotAvailable
- LAErrorBiometryNotEnrolled
没有录入指纹/人脸,iOS 11新增,由于新增Face ID,故用来代替LAErrorTouchIDNotEnrolled
- LAErrorBiometryLockout
超过重试限制,Touch ID/Face ID被锁定,需要进行设备密码解锁后重新激活
- LAErrorNotInteractive
应用尚未启动完成或者已经进入非激活状态时调用验证方法会收到该错误,例如:将验证方法放到didEnterBackground方法中进行可能会导致这个错误
选择验证方式
- (void)opinionBiologicalRecognition {
// 系统支持,最低支持iOS 8.0
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// 初始化 LAContext 上下文对象
LAContext *context = [LAContext new];
// 验证弹框提供两个按钮,CancelButton 点击取消,FallbackButton 点击输入数字密码,可自定义标题
// 首次验证失败后才会出现 FallbackButton
context.localizedCancelTitle = @"取消";
context.localizedFallbackTitle = @"使用密码";
// 初始化错误对象指针
NSError *error;
// 判断验证方式
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// iOS 11.0 及以上包含指纹及面部识别的机型
if (@available(iOS 11.0, *)) {
// FaceID
if (context.biometryType == LABiometryTypeFaceID) {
[self showFaceIdVerification:context];
}
// TouchID
else if (context.biometryType == LABiometryTypeTouchID) {
[self showTouchIdVerification:context];
}
// iOS 11.0 以下不包含面部识别
} else {
// TouchID
[self showTouchIdVerification:context];
}
}
}
}
Face ID
- (void)showFaceIdVerification:(LAContext *)context {
// 调用面部识别并初始化提示文案
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"面容ID" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
// 验证成功,回到主线程做后续操作
});
} else {
// 验证失败,后续处理
[self dealWithFaceIdOrTouchIdError:error];
}
}];
}
Touch ID
- (void)showFaceIdVerification:(LAContext *)context {
// 调用指纹识别并初始化提示文案
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请验证已有的指纹进行支付" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
// 验证成功,回到主线程做后续操作
});
} else {
// 验证失败,后续处理
[self dealWithFaceIdOrTouchIdError:error];
}
}];
}
验证失败处理
- (void)dealWithFaceIdOrTouchIdError:(NSError *)error {
switch (error.code) {
case LAErrorSystemCancel: {
// 系统取消授权,如其他APP切入
break;
}
case LAErrorUserCancel: {
// 用户取消验证Touch ID
break;
}
case LAErrorAuthenticationFailed: {
// 授权失败
break;
}
case LAErrorPasscodeNotSet: {
// 系统未设置密码
break;
}
case LAErrorTouchIDNotAvailable: {
// 设备Touch ID不可用,例如未打开
break;
}
case LAErrorTouchIDNotEnrolled: {
// 设备Touch ID不可用,用户未录入
break;
}
case LAErrorUserFallback: {
// 用户选择输入密码,切换主线程处理
break;
}
default: {
dispatch_async(dispatch_get_main_queue(), ^{
// 其他情况,切换主线程处理
});
break;
}
}
}