iOS 指紋驗證(Touch ID)
iOS的指紋識別是一個非常簡單的api系統(tǒng)已經(jīng)封好了,直接調(diào)起就行,非常簡單,蘋果的一貫作風(fēng),我們除了結(jié)果什么也拿不到,就一個bool結(jié)果和一個error,這里給一些比較懶的同學(xué)貼一下代碼
指紋驗證
//初始化上下文對象
LAContext* context = [LAContext new];
NSError* error = nil;
NSString* result = @"通過Home鍵驗證已有手機指紋";
/*
密碼驗證:
LAPolicyDeviceOwnerAuthentication 手機數(shù)字密碼
LAPolicyDeviceOwnerAuthenticationWithBiometrics 手機指紋密碼
*/
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
{
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error){
if (success)
{
//識別是在子線程中進行的,這里如果用到UI操作就要到主線程進行操作
NSLog(@"當(dāng)前線程:%@",[NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"當(dāng)前線程:%@",[NSThread currentThread]);
[self showMessage:@"驗證成功!"];
});
}
else
{
[self TouchIDResult:error.code];
}
}];
}
else
{
[self TouchIDResult:error.code];
}
這里需要注意一下:
- 驗證類型有2種:一種是系統(tǒng)的密碼(touchid被鎖時需要調(diào)用),一種是指紋
- 系統(tǒng)的密碼驗證和指紋識別實在子線程中進行的,我們在結(jié)果block的回調(diào)中如果要處理UI就要自己去回到主線程中去(系統(tǒng)不會幫我們回到主線程)
錯誤結(jié)果處理:
-(void)TouchIDResult:(LAError)code
{
NSString *result = nil;
switch (code)
{
case LAErrorAuthenticationFailed:
{
result = @"用戶驗證沒有通過,比如提供了錯誤的手指的指紋";
break;
}
case LAErrorUserCancel:
{
result = @"用戶取消了Touch ID驗證";
break;
}
case LAErrorUserFallback:
{
result = @"用戶不想進行Touch ID驗證,想進行輸入密碼操作";
dispatch_async(dispatch_get_main_queue(), ^{
//用戶選擇輸入密碼,可以調(diào)起app自己的密碼系統(tǒng),也可調(diào)起手機的密碼系統(tǒng)
});
break;
}
case LAErrorSystemCancel:
{
result = @"切換到其他APP,系統(tǒng)取消驗證Touch ID";
break;
}
case LAErrorPasscodeNotSet:
{
result = @"用戶沒有在設(shè)備Settings中設(shè)定密碼";
break;
}
case LAErrorTouchIDNotAvailable:
{
result = @"設(shè)備不支持Touch ID";
break;
}
case LAErrorTouchIDNotEnrolled:
{
result = @"設(shè)備沒有進行Touch ID 指紋注冊";
break;
}
case LAErrorTouchIDLockout:
{
result = @"touchid被鎖";
// 這里是驗證錯誤次數(shù)上限了,touchid被鎖,這時候需要調(diào)起系統(tǒng)的密碼驗證就行解鎖touchid,不然touchid就不能使用了
LAContext* context = [LAContext new];
NSString* result = @"請輸入手機密碼";
//LAPolicyDeviceOwnerAuthentication:手機密碼驗證
[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError *error){
if (success)
{
[self touchIDAction];
}
else
{
[self TouchIDResult:error.code];
}
}];
}
case LAErrorAppCancel:
{
result = @"應(yīng)用取消驗證";
break;
}
case LAErrorInvalidContext:
{
result = @"驗證失效";
break;
}
}
//回到主線程
dispatch_async(dispatch_get_main_queue(), ^{
[self showMessage:result];
});
}
這里需要注意:
錯誤類型LAErrorTouchIDLockout表示指紋驗證錯誤次數(shù)上限,這時需要調(diào)起手機密碼進行解鎖touchid
Touch ID 的東西簡單的就這些了,需要的同學(xué)拿去吧