簡介
Touch ID是蘋果公司的一種指紋識(shí)別技術(shù),從iPhone 5s開始攒岛,早已為人們所熟知舆绎。
Touch ID不存儲(chǔ)用戶的任何指紋圖像,只保存代表指紋的數(shù)字字符秸歧。蘋果公司提供Touch ID給第三方應(yīng)用程序使用厨姚,程序只會(huì)收到認(rèn)證是否成功的通知,而無法訪問 Touch ID 或與已注冊指紋相關(guān)的數(shù)據(jù)键菱,這一點(diǎn)對安全而言尤為重要谬墙。
現(xiàn)在有很多銀行類APP、涉及到支付類的APP都集成了指紋、手勢等二次驗(yàn)證功能拭抬,從而使APP獲得更高的安全性部默。今天我們就來分析一下指紋識(shí)別登錄功能的具體實(shí)現(xiàn)。
實(shí)現(xiàn)步驟
1.首先引入指紋解鎖的庫文件
#import <LocalAuthentication/LocalAuthentication.h>
2.兩個(gè)主要方法
- 這個(gè)方法是判斷設(shè)備是否支持TouchID的
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)
error __attribute__((swift_error(none)));
- 這個(gè)是用來驗(yàn)證TouchID的造虎,會(huì)有彈出框出來
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
3.核心源碼
在demo中touchID函數(shù)是實(shí)現(xiàn)指紋識(shí)別的核心代碼傅蹂,源碼如下:
- (void)touchID {
//創(chuàng)建LAContext
LAContext *context = [LAContext new];
//這個(gè)屬性是設(shè)置指紋輸入失敗之后的彈出框的選項(xiàng)
context.localizedFallbackTitle = @"沒有忘記密碼";
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// NSLog(@"支持指紋識(shí)別");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請按home鍵指紋登錄" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:@"登錄成功" preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:alert afterDelay:1.0];
self.nameLab.text = @"FBY展菲";
self.setOutBtn.hidden = NO;
});
}else{
NSLog(@"%@",error.localizedDescription);
switch (error.code) {
case LAErrorSystemCancel:
{
NSLog(@"系統(tǒng)取消授權(quán),如其他APP切入");
break;
}
case LAErrorUserCancel:
{
NSLog(@"用戶取消驗(yàn)證Touch ID");
break;
}
case LAErrorAuthenticationFailed:
{
NSLog(@"授權(quán)失敗");
break;
}
case LAErrorPasscodeNotSet:
{
NSLog(@"系統(tǒng)未設(shè)置密碼");
break;
}
case LAErrorTouchIDNotAvailable:
{
NSLog(@"設(shè)備Touch ID不可用算凿,例如未打開");
break;
}
case LAErrorTouchIDNotEnrolled:
{
NSLog(@"設(shè)備Touch ID不可用份蝴,用戶未錄入");
break;
}
case LAErrorUserFallback:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"用戶選擇輸入密碼,切換主線程處理");
}];
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"其他情況氓轰,切換主線程處理");
}];
break;
}
}
}
}];
}else{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:@"不支持指紋識(shí)別" preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:alert afterDelay:1.0];
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;
}
}
NSLog(@"%@",error.localizedDescription);
}
}
核心代碼只要分為兩部分婚夫,一部分是設(shè)備支持指紋識(shí)別,另一部分是設(shè)備不支持指紋識(shí)別
希望可以幫助大家
如果哪里有什么不對或者不足的地方戒努,還望讀者多多提意見或建議