首先大家要弄清一件事,那就是指紋解鎖和面容解鎖兩種方式是分開的,這點(diǎn)不用我們操心,因?yàn)樘O果爸爸已經(jīng)很好的給我們區(qū)分開了。
1.在iPhoneX 以下的設(shè)備都是指紋解鎖 Touch ID(5s以上設(shè)備)
2.在iPhoneX 以上的設(shè)備都是面容解鎖 Face ID (包含iPhoneX)
接下來,說點(diǎn)正事。就是不管事指紋還是面容對(duì)于我們來說都是一套代碼,一個(gè)框架。這是我比較感到欣慰的。
框架用的是 #import <LocalAuthentication/LocalAuthentication.h>
類用的是 LAContext
根據(jù) LAContext 的一些屬性和方法進(jìn)行設(shè)置和調(diào)用來完成我們項(xiàng)目的需求!
LAContext* context = [[LAContext alloc] init];
context.localizedFallbackTitle = @"自定義按鈕的文本";
context.localizedCancelTitle = @"取消按鈕的文本";
context.localizedReason = @"寫解鎖原因";
/*
LAPolicyDeviceOwnerAuthentication //系統(tǒng)密碼
LAPolicyDeviceOwnerAuthenticationWithBiometrics //自定義密碼
*/
核心代碼
//指紋解鎖調(diào)用方法
-(void)FingerprintIdentification2{
// 初始化上下文對(duì)象
LAContext* context = [[LAContext alloc] init];
NSError* error = nil;
NSString* result = @"需要您的支付進(jìn)行支付";
//localizedReason:result (解鎖原因)
context.localizedFallbackTitle = @"快捷支付";
context.localizedCancelTitle = @"取消";
NSLog(@"data before authentication = %@",[context evaluatedPolicyDomainState]);
// 首先使用canEvaluatePolicy 判斷設(shè)備支持狀態(tài)
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// 支持指紋驗(yàn)證
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {
if (success) {
//驗(yàn)證成功,主線程處理UI
NSLog(@"驗(yàn)證成功...");
NSLog(@"data after authentication = %@",[context evaluatedPolicyDomainState]);
}else{
NSLog(@"%@",error.localizedDescription);
switch (error.code) {
case LAErrorSystemCancel:
{
NSLog(@"Authentication was cancelled by the system");
//切換到其他APP,系統(tǒng)取消驗(yàn)證Touch ID
break;
}
case LAErrorUserCancel:
{
NSLog(@"Authentication was cancelled by the user");
//用戶取消驗(yàn)證Touch ID
break;
}
case LAErrorUserFallback:
{
NSLog(@"User selected to enter custom password");
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//用戶選擇輸入密碼,切換主線程處理
}];
break;
}
case LAErrorAuthenticationFailed:
{
NSLog(@"Authentication Failed");
break;
}
case LAErrorTouchIDLockout:
{
NSLog(@"TOUCH ID is locked out");
break;
}
case LAErrorAppCancel:
{
NSLog(@"app cancle the authentication");
break;
}
case LAErrorInvalidContext:
{
NSLog(@"context is invalidated");
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//其他情況,切換主線程處理
}];
break;
}
}
}
}];
}else {
NSLog(@"%@",error.localizedDescription);
//不支持指紋識(shí)別,LOG出錯(cuò)誤詳情
switch (error.code) {
case LAErrorTouchIDNotEnrolled:
{
NSLog(@"TouchID is not enrolled");
break;
}
case LAErrorPasscodeNotSet:
{
NSLog(@"A passcode has not been set");
break;
}
default:
{
NSLog(@"TouchID not available");
break;
}
}
}
}
謝謝閱讀!有不正確的,請(qǐng)您指出,加以改正!