部分效果圖
效果圖1
效果圖2
啟動效果圖3
一 . 指紋識別簡析
蘋果設(shè)計的ios是以安全性位核心,不管是沙河機(jī)制還是代碼簽名,指紋識別,最終目的都是為了安全.
自iPhone5S開始,蘋果公司推出全新生物安全識別技術(shù)--指紋識別驗(yàn)證(Touch ID).
自iPhone 5S始,蘋果公司推出了全新生物安全識別技術(shù)---指紋識別驗(yàn)證(Touch ID)。使得我們可以更快、更輕松地對設(shè)備進(jìn)行安全的訪問??少F的是,Touch ID做到了從任意角度讀取指紋數(shù)據(jù),克服了基于密碼進(jìn)行鎖定的不便。除此之外,蘋果還加入必須進(jìn)行密碼校驗(yàn)的場景,進(jìn)一步確保安全,例如【1】:
- 剛開機(jī)或重啟;
- 超過 48 小時未解鎖設(shè)備;
- 設(shè)備收到了遠(yuǎn)程鎖定命令;
- 五次未能成功匹配指紋;
- 進(jìn)入Touch ID設(shè)置模塊或更新新指紋;
- 最重要的一點(diǎn),蘋果公司提供Touch ID給第三方應(yīng)用程序使用,程序只會收到認(rèn)證是否成功的通知,而無法訪問 Touch ID 或與已注冊指紋相關(guān)的數(shù)據(jù),這一點(diǎn)對安全而言尤為重要。
為了獲得更高的安全性,很多銀行類、支付類APP都集成了指紋、手勢等二次驗(yàn)證功能。今天我們就重點(diǎn)來談?wù)凾ouch ID集成到APP的具體流程及實(shí)現(xiàn)。
二 . 流程分析
指紋登錄流程:

指紋登錄流程
二次啟動后識別登錄

二次啟動后識別登錄
使用過指紋登錄的朋友,大概都知道上面的流程。
這個業(yè)務(wù)實(shí)現(xiàn)的難點(diǎn)在于,首次登錄成功并啟用指紋授權(quán)--->退出APP后--->二次啟動APP,如何判斷是否要啟用指紋登錄驗(yàn)證呢?這時就需要我們對數(shù)據(jù)持久化和數(shù)據(jù)共享有較深的理解,很多APP開發(fā)者,在開發(fā)登錄保持的時候,大都會使用持久化數(shù)據(jù)的方式,存儲成功登錄的標(biāo)記。但對于安全性較高的APP,每次重新啟動時都會校驗(yàn)登錄狀態(tài),單靠持久化數(shù)據(jù)是不夠的。
我的解決方案是:
通過三個數(shù)據(jù)進(jìn)行登錄保持,
loginState:持久化數(shù)據(jù),用于存儲用戶登錄成功,未激活狀態(tài);
startAutoLoginState:持久化數(shù)據(jù),是否開啟指紋識別授權(quán);
isAppCurrentLoginState:共享數(shù)據(jù),登錄激活狀態(tài),該狀態(tài)的特點(diǎn),每次重新啟動APP都會重新初始化數(shù)據(jù)。
首次登錄:
三個數(shù)據(jù)變化情況:
|狀態(tài) |loginState |startAutoLoginState |isAppCurrentLoginState|
| -- | -- | ---|
|登錄之前| nil或NO| nil或NO| NO|
|登錄成功 |YES| nil或NO |YES|
|啟用指紋授權(quán) |YES |YES |YES|
|不啟用授權(quán)| YES| NO| YES|
二次驗(yàn)證登錄(指紋登錄):
三個數(shù)據(jù)變化情況,
- 如果loginState和startAutoLoginState同為YES,即可進(jìn)行指紋登錄驗(yàn)證,以下為數(shù)據(jù)變化情況;
|狀態(tài) |loginState |startAutoLoginState| isAppCurrentLoginState|
| -- | -- | ---|
|驗(yàn)證之前 |YES |YES| NO|
|驗(yàn)證失敗| NO |YES |NO|
|驗(yàn)證成功 |YES| YES| YES|
- 否則,重新登錄。
三 . 核心代碼實(shí)現(xiàn)
- 倒入頭文件#import <LocalAuthentication/LocalAuthentication.h>
判斷設(shè)備是否支持指紋識別--指紋驗(yàn)證
- (void)setFingerprint{
if ([JCCore getFingerprint] && [JCCore is_login]) {
UIView *v = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds ];
v.backgroundColor = [UIColor yellowColor];
//創(chuàng)建LAContext
LAContext *context = [LAContext new];
//這個屬性是設(shè)置指紋輸入失敗之后的彈出框的選項(xiàng)
context.localizedFallbackTitle = nil;
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[_window addSubview:v];
// 切換到主線程處理
}];
NSLog(@"支持指紋識別");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"需要驗(yàn)證您的指紋來確認(rèn)您的身份" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[v removeFromSuperview];
}];
[v removeFromSuperview];
NSLog(@"驗(yàn)證成功 刷新主界面 %@",[JCCore get_employee_info]);
}else {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 切換到主線程處理
[v removeFromSuperview];
[JCCore quitOut];
[self go_login];
}];
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{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 切換到主線程處理
[v removeFromSuperview];
[JCCore quitOut];
[self go_login];
}];
NSLog(@"不支持指紋識別");
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);
}
}
}
四 . 心得
指紋驗(yàn)證的結(jié)果是 成功 或 失敗, 在所回調(diào)的方法里面 做處理, 必須 先切到主線程 再處理事件.