一.簡單說明:
iphone5s問世后,蘋果添加了指紋解鎖功能,在iPhone X問世相繼添加了人臉識別功能,這在用戶進(jìn)行一些支付等驗(yàn)證操作更簡單和人性化!
記得要真機(jī)測試
二. LAContext用這個類可以實(shí)現(xiàn)TouchID 和 FaceID,首先你需要導(dǎo)入框架:#import <LocalAuthentication/LocalAuthentication.h>
示例代碼如下:
1.首先創(chuàng)建工具類,繼承: LAContext
LzwTouchID : LAContext
LzwTouchID.h
#import <LocalAuthentication/LocalAuthentication.h>
/**
* TouchID 狀態(tài)
*/
typedef NS_ENUM(NSUInteger, LzwTouchIDState){
/**
* 當(dāng)前設(shè)備不支持TouchID
*/
LzwTouchIDStateNotSupport = 0,
/**
* TouchID 驗(yàn)證成功
*/
LzwTouchIDStateSuccess = 1,
/**
* TouchID 驗(yàn)證失敗
*/
LzwTouchIDStateFail = 2,
/**
* TouchID 被用戶手動取消
*/
LzwTouchIDStateUserCancel = 3,
/**
* 用戶不使用TouchID,選擇手動輸入密碼
*/
LzwTouchIDStateInputPassword = 4,
/**
* TouchID 被系統(tǒng)取消 (如遇到來電,鎖屏,按了Home鍵等)
*/
LzwTouchIDStateSystemCancel = 5,
/**
* TouchID 無法啟動,因?yàn)橛脩魶]有設(shè)置密碼
*/
LzwTouchIDStatePasswordNotSet = 6,
/**
* TouchID 無法啟動,因?yàn)橛脩魶]有設(shè)置TouchID
*/
LzwTouchIDStateTouchIDNotSet = 7,
/**
* TouchID 無效
*/
LzwTouchIDStateTouchIDNotAvailable = 8,
/**
* TouchID 被鎖定(連續(xù)多次驗(yàn)證TouchID失敗,系統(tǒng)需要用戶手動輸入密碼)
*/
LzwTouchIDStateTouchIDLockout = 9,
/**
* 當(dāng)前軟件被掛起并取消了授權(quán) (如App進(jìn)入了后臺等)
*/
LzwTouchIDStateAppCancel = 10,
/**
* 當(dāng)前軟件被掛起并取消了授權(quán) (LAContext對象無效)
*/
LzwTouchIDStateInvalidContext = 11,
/**
* 系統(tǒng)版本不支持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進(jìn)行驗(yàn)證
@param desc Touch顯示的描述
@param block 回調(diào)狀態(tài)的block
*/
-(void)lzw_showTouchIDWithDescribe:(NSString *)desc BlockState:(StateBlock)block;
+ (LzwTouchID *)sharedInstance;
/**
啟動FaceID
@param desc FaceID顯示的描述
@param block 驗(yàn)證狀態(tài)
*/
- (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(@"系統(tǒng)版本不支持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鍵驗(yàn)證已有指紋":desc reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 驗(yàn)證成功");
block(LzwTouchIDStateSuccess,error);
});
}else if(error){
switch (error.code) {
case LAErrorAuthenticationFailed:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 驗(yàn)證失敗");
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 被系統(tǒng)取消 (如遇到來電,鎖屏,按了Home鍵等)");
block(LzwTouchIDStateSystemCancel,error);
});
}
break;
case LAErrorPasscodeNotSet:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 無法啟動,因?yàn)橛脩魶]有設(shè)置密碼");
block(LzwTouchIDStatePasswordNotSet,error);
});
}
break;
case LAErrorTouchIDNotEnrolled:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 無法啟動,因?yàn)橛脩魶]有設(shè)置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(@"當(dāng)前軟件被掛起并取消了授權(quán) (如App進(jìn)入了后臺等)");
block(LzwTouchIDStateAppCancel,error);
});
}
break;
case LAErrorInvalidContext:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"當(dāng)前軟件被掛起并取消了授權(quán) (LAContext對象無效)");
block(LzwTouchIDStateInvalidContext,error);
});
}
break;
default:
break;
}
}
}];
}else{
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"用來驗(yàn)證指紋!" 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權(quán)限才可以通過Face ID驗(yàn)證哦!不然只能輸密碼啦...
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
block(LzwFaceIDStateSuccess,error);
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"當(dāng)前軟件被掛起并取消了授權(quán) (如App進(jìn)入了后臺等)");
block(LzwFaceIDStateFail,error);
});
}
}];
}
}
Finish!!!