一.简单说明:
iphone5s问世后,苹果添加了指纹解锁功能,在iPhone X问世相继添加了人脸识别功能,这在用户进行一些支付等验证操作更简单和人性化!
记得要真机测试
二. LAContext用这个类可以实现TouchID 和 FaceID,首先你需要导入框架:#import <LocalAuthentication/LocalAuthentication.h>
示例代码如下:
1.首先创建工具类,继承: LAContext
LzwTouchID : LAContext
LzwTouchID.h
#import <LocalAuthentication/LocalAuthentication.h>
/**
* TouchID 状态
*/
typedef NS_ENUM(NSUInteger, LzwTouchIDState){
/**
* 当前设备不支持TouchID
*/
LzwTouchIDStateNotSupport = 0,
/**
* TouchID 验证成功
*/
LzwTouchIDStateSuccess = 1,
/**
* TouchID 验证失败
*/
LzwTouchIDStateFail = 2,
/**
* TouchID 被用户手动取消
*/
LzwTouchIDStateUserCancel = 3,
/**
* 用户不使用TouchID,选择手动输入密码
*/
LzwTouchIDStateInputPassword = 4,
/**
* TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)
*/
LzwTouchIDStateSystemCancel = 5,
/**
* TouchID 无法启动,因为用户没有设置密码
*/
LzwTouchIDStatePasswordNotSet = 6,
/**
* TouchID 无法启动,因为用户没有设置TouchID
*/
LzwTouchIDStateTouchIDNotSet = 7,
/**
* TouchID 无效
*/
LzwTouchIDStateTouchIDNotAvailable = 8,
/**
* TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码)
*/
LzwTouchIDStateTouchIDLockout = 9,
/**
* 当前软件被挂起并取消了授权 (如App进入了后台等)
*/
LzwTouchIDStateAppCancel = 10,
/**
* 当前软件被挂起并取消了授权 (LAContext对象无效)
*/
LzwTouchIDStateInvalidContext = 11,
/**
* 系统版本不支持TouchID (必须高于iOS 8.0才能使用)
*/
LzwTouchIDStateVersionNotSupport = 12
};
typedef NS_ENUM(NSUInteger, TDFaceIDState){
LzwFaceIDStateSuccess = 0,
LzwFaceIDStateFail= 1
};
@interface LzwTouchID : LAContext
typedef void (^StateBlock)(LzwTouchIDState state,NSError *error);
typedef void (^faceIDStateBlock)(LzwFaceIDState state,NSError *error);
/**
启动TouchID进行验证
@param desc Touch显示的描述
@param block 回调状态的block
*/
-(void)lzw_showTouchIDWithDescribe:(NSString *)desc BlockState:(StateBlock)block;
+ (LzwTouchID *)sharedInstance;
/**
启动FaceID
@param desc FaceID显示的描述
@param block 验证状态
*/
- (void)lzw_showFaceIDWithDescribe:(NSString *)desc BlockState:(faceIDStateBlock)block;
@end
LzwTouchID.m
+ (instancetype)sharedInstance {
static LzwTouchID *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[LzwTouchID alloc] init];
});
return instance;
}
-(void)lzw_showTouchIDWithDescribe:(NSString *)desc BlockState:(StateBlock)block{
if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"系统版本不支持TouchID (必须高于iOS 8.0才能使用)");
block(LzwTouchIDStateVersionNotSupport,nil);
});
return;
}
LAContext *context = [[LAContext alloc]init];
context.localizedFallbackTitle = desc;
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:desc == nil ? @"通过Home键验证已有指纹":desc reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 验证成功");
block(LzwTouchIDStateSuccess,error);
});
}else if(error){
switch (error.code) {
case LAErrorAuthenticationFailed:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 验证失败");
block(LzwTouchIDStateFail,error);
});
break;
}
case LAErrorUserCancel:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 被用户手动取消");
block(LzwTouchIDStateUserCancel,error);
});
}
break;
case LAErrorUserFallback:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"用户不使用TouchID,选择手动输入密码");
block(LzwTouchIDStateInputPassword,error);
});
}
break;
case LAErrorSystemCancel:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)");
block(LzwTouchIDStateSystemCancel,error);
});
}
break;
case LAErrorPasscodeNotSet:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 无法启动,因为用户没有设置密码");
block(LzwTouchIDStatePasswordNotSet,error);
});
}
break;
case LAErrorTouchIDNotEnrolled:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 无法启动,因为用户没有设置TouchID");
block(LzwTouchIDStateTouchIDNotSet,error);
});
}
break;
case LAErrorTouchIDNotAvailable:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 无效");
block(LzwTouchIDStateTouchIDNotAvailable,error);
});
}
break;
case LAErrorTouchIDLockout:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 无效");
block(LzwTouchIDStateTouchIDLockout,error);
});
}
break;
case LAErrorAppCancel:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)");
block(LzwTouchIDStateAppCancel,error);
});
}
break;
case LAErrorInvalidContext:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"当前软件被挂起并取消了授权 (LAContext对象无效)");
block(LzwTouchIDStateInvalidContext,error);
});
}
break;
default:
break;
}
}
}];
}else{
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"用来验证指纹!" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
block(LzwTouchIDStateSuccess,error);
});
}
else
{
dispatch_async(dispatch_get_main_queue(), ^{
block(LzwTouchIDStateFail,error);
});
}
}];
}
}
-(void)lzw_showFaceIDWithDescribe:(NSString *)desc BlockState:(faceIDStateBlock)block
{
NSError *error;
LAContext *context = [[LAContext alloc]init];
BOOL canAuthentication = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];
if (canAuthentication) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:desc reply:^(BOOL success, NSError * _Nullable error) {
//注意iOS 11.3之后需要配置Info.plist权限才可以通过Face ID验证哦!不然只能输密码啦...
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
block(LzwFaceIDStateSuccess,error);
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)");
block(LzwFaceIDStateFail,error);
});
}
}];
}
}
Finish!!!
网友评论