部分效果圖
效果圖1
效果圖2
啟動效果圖3
一 . 指紋識別簡析
蘋果設計的ios是以安全性位核心,不管是沙河機制還是代碼簽名,指紋識別,最終目的都是為了安全.
自iPhone5S開始,蘋果公司推出全新生物安全識別技術--指紋識別驗證(Touch ID).
自iPhone 5S始劫拗,蘋果公司推出了全新生物安全識別技術---指紋識別驗證(Touch ID)疼蛾。使得我們可以更快苗沧、更輕松地對設備進行安全的訪問戚宦「鍪铮可貴的是,Touch ID做到了從任意角度讀取指紋數(shù)據(jù)受楼,克服了基于密碼進行鎖定的不便垦搬。除此之外,蘋果還加入必須進行密碼校驗的場景艳汽,進一步確保安全猴贰,例如【1】:
- 剛開機或重啟;
- 超過 48 小時未解鎖設備河狐;
- 設備收到了遠程鎖定命令米绕;
- 五次未能成功匹配指紋;
- 進入Touch ID設置模塊或更新新指紋馋艺;
- 最重要的一點义郑,蘋果公司提供Touch ID給第三方應用程序使用,程序只會收到認證是否成功的通知丈钙,而無法訪問 Touch ID 或與已注冊指紋相關的數(shù)據(jù)非驮,這一點對安全而言尤為重要。
為了獲得更高的安全性雏赦,很多銀行類劫笙、支付類APP都集成了指紋芙扎、手勢等二次驗證功能。今天我們就重點來談談Touch ID集成到APP的具體流程及實現(xiàn)填大。
二 . 流程分析
指紋登錄流程:
指紋登錄流程
二次啟動后識別登錄
二次啟動后識別登錄
使用過指紋登錄的朋友戒洼,大概都知道上面的流程。
這個業(yè)務實現(xiàn)的難點在于允华,首次登錄成功并啟用指紋授權--->退出APP后--->二次啟動APP圈浇,如何判斷是否要啟用指紋登錄驗證呢?這時就需要我們對數(shù)據(jù)持久化和數(shù)據(jù)共享有較深的理解靴寂,很多APP開發(fā)者磷蜀,在開發(fā)登錄保持的時候,大都會使用持久化數(shù)據(jù)的方式百炬,存儲成功登錄的標記褐隆。但對于安全性較高的APP,每次重新啟動時都會校驗登錄狀態(tài)剖踊,單靠持久化數(shù)據(jù)是不夠的庶弃。
我的解決方案是:
通過三個數(shù)據(jù)進行登錄保持,
loginState:持久化數(shù)據(jù)德澈,用于存儲用戶登錄成功歇攻,未激活狀態(tài);
startAutoLoginState:持久化數(shù)據(jù)梆造,是否開啟指紋識別授權掉伏;
isAppCurrentLoginState:共享數(shù)據(jù),登錄激活狀態(tài)澳窑,該狀態(tài)的特點斧散,每次重新啟動APP都會重新初始化數(shù)據(jù)。
首次登錄:
三個數(shù)據(jù)變化情況:
|狀態(tài) |loginState |startAutoLoginState |isAppCurrentLoginState|
| -- | -- | ---|
|登錄之前| nil或NO| nil或NO| NO|
|登錄成功 |YES| nil或NO |YES|
|啟用指紋授權 |YES |YES |YES|
|不啟用授權| YES| NO| YES|
二次驗證登錄(指紋登錄):
三個數(shù)據(jù)變化情況摊聋,
- 如果loginState和startAutoLoginState同為YES鸡捐,即可進行指紋登錄驗證,以下為數(shù)據(jù)變化情況麻裁;
|狀態(tài) |loginState |startAutoLoginState| isAppCurrentLoginState|
| -- | -- | ---|
|驗證之前 |YES |YES| NO|
|驗證失敗| NO |YES |NO|
|驗證成功 |YES| YES| YES|
- 否則箍镜,重新登錄。
三 . 核心代碼實現(xiàn)
- 倒入頭文件#import <LocalAuthentication/LocalAuthentication.h>
判斷設備是否支持指紋識別--指紋驗證
- (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];
//這個屬性是設置指紋輸入失敗之后的彈出框的選項
context.localizedFallbackTitle = nil;
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[_window addSubview:v];
// 切換到主線程處理
}];
NSLog(@"支持指紋識別");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"需要驗證您的指紋來確認您的身份" reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[v removeFromSuperview];
}];
[v removeFromSuperview];
NSLog(@"驗證成功 刷新主界面 %@",[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)取消授權煎源,如其他APP切入");
break;
}
case LAErrorUserCancel:
{
NSLog(@"用戶取消驗證Touch ID");
break;
}
case LAErrorAuthenticationFailed:
{
NSLog(@"授權失敗,請手動登錄");
break;
}
case LAErrorPasscodeNotSet:
{
NSLog(@"系統(tǒng)未設置密碼");
break;
}
case LAErrorTouchIDNotAvailable:
{
NSLog(@"設備Touch ID不可用色迂,例如未打開");
break;
}
case LAErrorTouchIDNotEnrolled:
{
NSLog(@"設備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);
}
}
}
四 . 心得
指紋驗證的結果是 成功 或 失敗, 在所回調的方法里面 做處理, 必須 先切到主線程 再處理事件.