Touch ID使用

前言:如果圖片看不了請(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
  • github-Demo下載請(qǐng)點(diǎn)我—— 如果太慢可以就點(diǎn)我下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹 Touch ID是iPhone5S后加入的一項(xiàng)新的功能,也就是大家熟知的指紋識(shí)別技術(shù)。iOS8后蘋果開放了T...
    Dincoln閱讀 1,446評(píng)論 0 2
  • 支持系統(tǒng)和機(jī)型 iOS系統(tǒng)的指紋識(shí)別功能最低支持的機(jī)型為iPhone 5s,最低支持系統(tǒng)為iOS 8,雖然安裝iO...
    MMD_閱讀 499評(píng)論 0 0
  • 簡單介紹 支持系統(tǒng)和機(jī)型 iOS系統(tǒng)的指紋識(shí)別功能最低支持的機(jī)型為iPhone 5s,最低支持系統(tǒng)為iOS 8,雖...
    93a13ee543af閱讀 1,156評(píng)論 0 4
  • 由于最近要使用指紋解鎖app,就暫且了解了一下,注釋非常詳細(xì)。需要注意的是在successBlock里面代碼是后臺(tái)...
    DSA碼儂閱讀 428評(píng)論 0 2
  • 最近看了一些闡述人性方面的書,受益匪淺。 之前,我在小說創(chuàng)作中多次寫到艱難處,不是因?yàn)楣适虑楣?jié)無法安排寫不下去,而...
    簡Lisa閱讀 214評(píng)論 2 1

友情鏈接更多精彩內(nèi)容