前言:如果圖片看不了請(qǐng)移步:簡書
Touch ID簡介
-
Touch ID指紋識(shí)別作為iPhone 5s上的“殺手級(jí)”功能早已為人們所熟知,目前搭載的設(shè)備有iphone SE、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Pro、iPad mini 4、iPad mini 3和iPad air 2 -
iOS 8.0開放了指紋驗(yàn)證的API,為APP增添了新的解鎖姿勢(shì),Touch ID在iPhone 6、iPhone 6 Plus上表現(xiàn)平平,識(shí)別效率低下成為眾多用戶的吐槽點(diǎn) - 蘋果在2015新品發(fā)布會(huì)上提及全新的
iPhone 6s、iPhone 6s Plus采用第二代Touch ID,新的Touch ID識(shí)別速度更快;實(shí)際體驗(yàn)中只要輕輕觸碰一下即可,以往要按壓半秒鐘的指紋識(shí)別過程,現(xiàn)在基本是一觸即發(fā) - 隨著安卓也有越來越多的設(shè)備配備了類似Touch ID的指紋識(shí)別裝置,今后會(huì)有越來越多的APP選擇使用
指紋識(shí)別的驗(yàn)證方式
Touch ID原理
- Touch ID不存儲(chǔ)用戶的任何指紋圖像,只保存代表指紋的數(shù)字字符。iPhone 5s的A7處理器采用了新的高級(jí)安全架構(gòu),其中有一塊名為Secure Enclave的區(qū)域用以專門保護(hù)密碼和指紋數(shù)據(jù)。只有Secure Enclave可以訪問指紋數(shù)據(jù),而且它還把這些數(shù)據(jù)同處理器和系統(tǒng)隔開,因而這些永遠(yuǎn)不會(huì)被存儲(chǔ)在蘋果的服務(wù)器上,也不會(huì)被同步到iCloud或其他地方。除了Touch ID之外,它們不會(huì)被匹配到其他指紋庫中
- 相信很多人都知道,一個(gè)Touch ID傳感器和iPhone是一對(duì)一的關(guān)系,如果損壞,只能售后,無法自行更換,其中的原理比較復(fù)雜。一種可能的解釋是蘋果阻止了任何Touch ID和Secure Enclave之間的任何數(shù)據(jù)嗅探和截取,實(shí)現(xiàn)了特定處理器配對(duì)特定的Touch ID。
- 如果可以隨意更換,那么有人將用戶的指紋傳感器更換,就可以在用戶不知情的情況下竊取到指紋數(shù)據(jù)。蘋果的技術(shù)降低了這一風(fēng)險(xiǎn),這意味著不法之徒想要
調(diào)包傳感器的話,需要單獨(dú)破解每臺(tái)設(shè)備,對(duì)于重視安全性的用戶來說,這個(gè)發(fā)現(xiàn)當(dāng)然是個(gè)好消息

Touch ID原理.png
Touch ID常用方法與枚舉解釋
首先蘋果提供了
canEvaluatePolicy:error:來判斷運(yùn)行的設(shè)備是否支持Touch ID如果要讓其失效,可以調(diào)用
invalidate,新特征:iOS 9.0和Mac OS 10.11-
還提供了
evaluatePolicy:localizedReason:reply:來驗(yàn)證識(shí)別的情況,具體類型如下(以下枚舉類型出現(xiàn)的情況均已測(cè)試并標(biāo)注):// 身份驗(yàn)證沒有成功,因?yàn)橛脩粑茨芴峁┯行У膽{據(jù)(連續(xù)3次驗(yàn)證失敗時(shí)提示) LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed, // 身份驗(yàn)證被用戶取消(當(dāng)用戶點(diǎn)擊取消按鈕時(shí)提示) LAErrorUserCancel = kLAErrorUserCancel, // 認(rèn)證被取消了,因?yàn)橛脩酎c(diǎn)擊回退按鈕(當(dāng)用戶點(diǎn)擊輸入密碼時(shí)提示) LAErrorUserFallback = kLAErrorUserFallback, // 身份驗(yàn)證被系統(tǒng)取消(驗(yàn)證時(shí)當(dāng)前APP被移至后臺(tái)或者點(diǎn)擊了home鍵導(dǎo)致驗(yàn)證退出時(shí)提示) LAErrorSystemCancel = kLAErrorSystemCancel, // Touch ID無法啟動(dòng),因?yàn)闆]有設(shè)置密碼(當(dāng)系統(tǒng)沒有設(shè)置密碼的時(shí)候,Touch ID也將不會(huì)開啟) LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet, // 無法啟動(dòng)身份驗(yàn)證(這種情況沒有檢測(cè)到,應(yīng)該是出現(xiàn)硬件損壞才會(huì)出現(xiàn)) LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable, // 無法啟動(dòng)身份驗(yàn)證,因?yàn)橛|摸沒有注冊(cè)的手指 (這個(gè)暫時(shí)沒檢測(cè)到) LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled, // 身份驗(yàn)證是不成功的,因?yàn)橛刑嗟氖?huì)要求密碼解除鎖定,(前提是使用 LAPolicyDeviceOwnerAuthenticationWithBiometrics)iOS9和MAC OS0.11新特征 LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout, // 認(rèn)證被取消的應(yīng)用(如無效而認(rèn)證進(jìn)行調(diào)用)這個(gè)暫時(shí)沒有檢測(cè)到,可能是蘋果預(yù)留的 iOS9和MAC OS0.11新特征 LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel, // LAContext通過這個(gè)電話已經(jīng)失效(當(dāng)LAContext失效時(shí)會(huì)調(diào)用)iOS9和MAC OS0.11新特征 LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
Touch 使用
-
首先,我們需要引入
LocalAuthentication框架#import <LocalAuthentication/LocalAuthentication.h> -
使用很簡單,先創(chuàng)建一個(gè)
LAContext對(duì)象并配置必要的信息LAContext *context = [[LAContext alloc] init]; // 當(dāng)指紋識(shí)別失敗一次后,彈框會(huì)多出一個(gè)選項(xiàng),而這個(gè)屬性就是用來設(shè)置那個(gè)選項(xiàng)的內(nèi)容 context.localizedFallbackTitle = @"使用密碼登錄"; -
配置好LAContext對(duì)象后,就需要判斷一下設(shè)備
是否支持指紋識(shí)別功能NSError *error = nil; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 該設(shè)備支持指紋識(shí)別 }else { } -
當(dāng)設(shè)備支持指紋識(shí)別的時(shí)候,實(shí)現(xiàn)如下
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"身份驗(yàn)證需要解鎖指紋識(shí)別功能" reply:^(BOOL success, NSError * _Nullable error) { if (success) { // 驗(yàn)證成功 }else { NSLog(@"%@", error.localizedDescription); switch (error.code) { case LAErrorSystemCancel: NSLog(@"身份驗(yàn)證被系統(tǒng)取消(驗(yàn)證時(shí)當(dāng)前APP被移至后臺(tái)或者點(diǎn)擊了home鍵導(dǎo)致驗(yàn)證退出時(shí)提示)"); break; case LAErrorUserCancel: NSLog(@"身份驗(yàn)證被用戶取消(當(dāng)用戶點(diǎn)擊取消按鈕時(shí)提示)"); break; case LAErrorAuthenticationFailed: NSLog(@"身份驗(yàn)證沒有成功,因?yàn)橛脩粑茨芴峁┯行У膽{據(jù)(連續(xù)3次驗(yàn)證失敗時(shí)提示)"); break; case LAErrorPasscodeNotSet: NSLog(@"Touch ID無法啟動(dòng),因?yàn)闆]有設(shè)置密碼(當(dāng)系統(tǒng)沒有設(shè)置密碼的時(shí)候,Touch ID也將不會(huì)開啟)"); break; case LAErrorTouchIDNotAvailable: NSLog(@"無法啟動(dòng)身份驗(yàn)證"); // 這個(gè)沒有檢測(cè)到,應(yīng)該是出現(xiàn)硬件損壞才會(huì)出現(xiàn) break; case LAErrorTouchIDNotEnrolled: NSLog(@"無法啟動(dòng)身份驗(yàn)證,因?yàn)橛|摸標(biāo)識(shí)沒有注冊(cè)的手指"); // 這個(gè)暫時(shí)沒檢測(cè)到 break; case LAErrorUserFallback: { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"用戶選擇輸入密碼,切換主線程處理"); }]; break; } default: { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"其他情況,切換主線程處理"); // 5次失敗進(jìn)入,如果繼續(xù)驗(yàn)證,則需要輸入密碼解鎖 }]; break; } } } } ]; -
如果不支持,實(shí)現(xiàn)如下
效果:NSLog(@"不支持指紋識(shí)別"); switch (error.code) { case LAErrorTouchIDNotEnrolled: NSLog(@"設(shè)備Touch ID不可用"); break; case LAErrorPasscodeNotSet: NSLog(@"系統(tǒng)未設(shè)置密碼"); break; default: NSLog(@"TouchID不可用或已損壞"); break; } NSLog(@"%@", error.localizedDescription);Touch ID效果.gif
