iOS指紋識別

簡述: 在類似支付寶為首的應(yīng)用以及各種理財?shù)壬婕板X財對安全性要求較高的應(yīng)用中,目前普遍對關(guān)鍵數(shù)據(jù)都做了安全訪問限制,比如通過手勢密碼、指紋密碼等手段,本章主要分析一下iOS開發(fā)中指紋識別的一些坑和技術(shù)要點。

指紋識別

指紋識別是iPhone5s iOS8.0之后推出的功能,需要硬件以及軟件的支持。指紋識別的功能定義在系統(tǒng)框架<LocalAuthentication/LocalAuthentication.h>中,并且在app中集成指紋識別是跟系統(tǒng)解鎖iPhone用的一套指紋識別,就是說假如在app中指紋識別錯誤了5次(iOS 系統(tǒng)默認(rèn)指紋識別錯誤5次后,指紋識別會被判定為無效狀態(tài)),那么不僅app中的指紋識別系統(tǒng)是無效的,系統(tǒng)的iPhone指紋識別解鎖系統(tǒng)也是無效的,必須輸入iPhone解鎖口令碼驗證之后,指紋識別才會被系統(tǒng)重新判別為有效!指紋識別有兩個模式:

typedef NS_ENUM(NSInteger, LAPolicy)
{
   //8.0支持的API
    LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,
   //9.0支持的API
    LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication
} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);

需要注意的是開發(fā)的時候一定要注意區(qū)分iOS系統(tǒng)的版本選用不同的API,避免出現(xiàn)重大問題。同時這兩個不同的模式的響應(yīng)方式也是不同的:

LAPolicyDeviceOwnerAuthenticationWithBiometrics

生物指紋識別。驗證彈框有兩個按鈕,第一個是取消按鈕,第二個按鈕可以自定義標(biāo)題名稱(默認(rèn)是"輸入密碼")。只有在第一次指紋驗證失敗后才會出現(xiàn)第二個按鈕,這種鑒定方式的第二個按鈕的功能自定義,第二個按鈕的功能不做處理的話不會有任何響應(yīng)。

圖片.png

前三次指紋驗證失敗,指紋驗證框不再彈出。再次重新進(jìn)入驗證,還有兩次驗證機(jī)會,如果還是驗證失敗,TOUCH ID 被鎖住不再繼續(xù)彈出指紋驗證框。(在iOS10.0以下系統(tǒng)中,不包括iOS 10.0,以后每次進(jìn)來驗證都是調(diào)用系統(tǒng)的設(shè)備密碼直至輸入正確的設(shè)備密碼方可解除TOUCH ID鎖,但是在iOS 10.0系統(tǒng)中,指紋識別累計錯誤5次系統(tǒng)判定指紋無效后不會彈出系統(tǒng)的設(shè)備密碼輸入頁面,尷尬......開發(fā)的時候誰曉得iOS 10有這個大坑,被坑慘了。

Talk is cheap,show me the code.

- (void)checkTouchID{
    
    LAContext *laContext = [[LAContext alloc] init];
    //去掉 “輸入密碼”,這行代碼可以去掉“輸入密碼”的按鈕
    laContext.localizedFallbackTitle = @"";
    NSError *error;
    if ([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        NSLog(@"指紋識別有效");
        [laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:@"通過Home鍵驗證已有手機(jī)指紋"
                            reply:^(BOOL success, NSError *error) {
                                if (success) {
                                    //指紋驗證通過
                                }else if (error.code == kLAErrorUserCancel){
                                    //用戶點擊取消
                                }else if (error.code == kLAErrorAuthenticationFailed){
                                    //用戶驗證沒有通過,指紋錯誤
                                }
                            }];
    }else {
        NSLog(@"指紋識別無效%@",error.localizedDescription);
        //不支持指紋識別,LOG出錯誤詳情
        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;
            }
        }
    }
}

在iOS10系統(tǒng)中,指紋識別錯誤5次后,調(diào)用[laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]就會返回NO,在- (void)checkTouchID方法中,就會打印信息:NSLog(@"指紋識別無效%@",error.localizedDescription);代碼會跳到這個位置。

在iOS9、iOS8 系統(tǒng)中,指紋識別錯誤5次后,調(diào)用[laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]就會返回YES,在- (void)checkTouchID方法中,就會打印信息:指紋識別有效。 代碼會跳到這個位置。NSLog(@"指紋識別有效");

LAPolicyDeviceOwnerAuthentication

生物指紋識別或系統(tǒng)密碼驗證。注意這個policy是9.0的API,對于8.0系統(tǒng)的手機(jī)不能使用。如果TOUCH ID 可用,且已經(jīng)錄入指紋,則優(yōu)先調(diào)用指紋驗證。其次是調(diào)用系統(tǒng)密碼驗證,如果沒有開啟設(shè)備密碼,則不可以使用這種驗證方式。指紋識別驗證失敗三次將自動彈出設(shè)備密碼輸入框,如果不進(jìn)行密碼輸入。再次進(jìn)來還可以有兩次機(jī)會驗證指紋,如果都失敗則TOUCH ID被鎖住。以后也只能彈出設(shè)備密碼輸入框。補(bǔ)充:值得注意的是在iOS9系統(tǒng)中,前三次驗證失敗會自動彈出密碼驗證框,后兩次驗證失敗后不會自動彈出密碼驗證框。而在iOS 10系統(tǒng)中,前三次驗證失敗或者后兩次驗證失敗,都會自動彈出密碼驗證框。

- (void)checkTouchID{
    
    LAContext *laContext = [[LAContext alloc] init];
    //去掉 “輸入密碼”
    laContext.localizedFallbackTitle = @"";
    NSError *error;
    if ([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
        NSLog(@"指紋識別有效");
        [laContext evaluatePolicy:LAPolicyDeviceOwnerAuthentication
                  localizedReason:@"通過Home鍵驗證已有手機(jī)指紋"
                            reply:^(BOOL success, NSError *error) {
                                if (success) {
                                    //指紋驗證通過
                                }else if (error.code == kLAErrorUserCancel){
                                    //用戶點擊取消
                                }else if (error.code == kLAErrorAuthenticationFailed){
                                    //用戶驗證沒有通過,指紋錯誤
                                }
                            }];
    }else {
        NSLog(@"指紋識別無效%@",error.localizedDescription);
        //不支持指紋識別,LOG出錯誤詳情
        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;
            }
        }
    }
}

在iOS9、iOS 10系統(tǒng)中,這個policy默認(rèn)也有兩個按鈕,第一次驗證指紋識別后會顯示兩個按鈕,第二個按鈕是"輸入密碼",默認(rèn)點擊第二個按鈕會彈出設(shè)備密碼輸入框。

異常情況

上面所描述的是iOS系統(tǒng)設(shè)置了口令密碼,同時也添加了指紋的情況。但是用戶在使用過程中可能會出現(xiàn)各種情況,下面分析一下兩種policy在不同系統(tǒng)上,只有口令密碼、只有指紋、沒有口令也沒有指紋的情況下所作出的響應(yīng),通過打印輸出結(jié)果確定代碼的跳轉(zhuǎn)位置。

LAPolicyDeviceOwnerAuthenticationWithBiometrics
- (void)checkTouchID{
    LAContext *laContext = [[LAContext alloc] init];
    //去掉 “輸入密碼”
    laContext.localizedFallbackTitle = @"";
    NSError *error;
    if ([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        NSLog(@"指紋識別有效");
    }else {
        NSLog(@"指紋識別無效%@",error.localizedDescription);
    }
}

iOS8系統(tǒng):
在只有口令密碼的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);
在只有指紋的情況下打印結(jié)果: NSLog(@"指紋識別無效%@",error.localizedDescription);
在沒有口令也沒有指紋的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);

iOS9系統(tǒng):
在只有口令密碼的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);
在只有指紋的情況下打印結(jié)果: NSLog(@"指紋識別無效%@",error.localizedDescription);
在沒有口令也沒有指紋的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);

iOS10系統(tǒng):
在只有口令密碼的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);
在只有指紋的情況下打印結(jié)果: NSLog(@"指紋識別無效%@",error.localizedDescription);
在沒有口令也沒有指紋的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);
分析可知,在LAPolicyDeviceOwnerAuthenticationWithBiometrics下必須系統(tǒng)口令碼和指紋同時是存在的,才會判定指紋系統(tǒng)是可用的。

LAPolicyDeviceOwnerAuthentication
- (void)checkTouchID{
    
    LAContext *laContext = [[LAContext alloc] init];
    //去掉 “輸入密碼”
    laContext.localizedFallbackTitle = @"";
    NSError *error;
    if ([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {
        NSLog(@"指紋識別有效");
    }else {
        NSLog(@"指紋識別無效%@",error.localizedDescription);
    }
}

iOS9系統(tǒng):
在只有口令密碼的情況下打印結(jié)果:NSLog(@"指紋識別有效");
在只有指紋的情況下打印結(jié)果: NSLog(@"指紋識別無效%@",error.localizedDescription);
在沒有口令也沒有指紋的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);

iOS10系統(tǒng):
在只有口令密碼的情況下打印結(jié)果:NSLog(@"指紋識別有效");
在只有指紋的情況下打印結(jié)果: NSLog(@"指紋識別無效%@",error.localizedDescription);
在沒有口令也沒有指紋的情況下打印結(jié)果:NSLog(@"指紋識別無效%@",error.localizedDescription);
綜合iOS9、iOS10在policy:LAPolicyDeviceOwnerAuthentication下的表現(xiàn),只要開啟了系統(tǒng)口令碼,就判定指紋系統(tǒng)可用,更加印證了 如果沒有開啟設(shè)備密碼,則不可以使用這種驗證方式。

指紋鑒定錯誤碼

1、 驗證(指紋/密碼)不能開啟的錯誤信息(指紋系統(tǒng)被判定為無效):
LAErrorPasscodeNotSet : 設(shè)備密碼未設(shè)置
LAErrorTouchIDNotAvailable : TOUCH ID不可用
LAErrorTouchIDNotEnrolled : 指紋未錄入
LAErrorTouchIDLockout : TOUCH ID被鎖定
LAErrorAppCancel : APP調(diào)用了- (void)invalidate
方法使LAContext
失效
LAErrorInvalidContext : 實例化的LAContext
對象失效,再次調(diào)用evaluation...
方法則會彈出此錯誤信息
2、 其他錯誤信息(指紋系統(tǒng)判定有效,但是驗證指紋錯誤):
LAErrorAuthenticationFailed : 鑒定失敗
LAErrorUserCancel : 用戶取消
LAErrorUserFallback : 用戶選擇輸入密碼
LAErrorSystemCancel : 系統(tǒng)取消(如:另外一個應(yīng)用進(jìn)入前臺)

總結(jié)

上面分析了指紋識別的兩種policy在不同系統(tǒng)上、不同狀態(tài)下的各種響應(yīng)狀態(tài),并且列出了一些指紋鑒定錯誤碼,相信對整個API的作用有詳盡的認(rèn)識,開發(fā)出類似支付寶指紋識別的流程也不是難事,希望可以幫助更多人。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內(nèi)容

  • 指紋識別: iPhone5S開始,推出指紋識別 iOS8.0之后蘋果允許第三方 App 使用 Touch ID進(jìn)行...
    a437e8f87a81閱讀 1,396評論 0 17
  • 簡介 蘋果從iPhone5S開始,具有指紋識別技術(shù),從iOS8.0之后蘋果允許第三方 App 使用 Touch I...
    z4ywzrq閱讀 6,576評論 10 75
  • 項目需要用到指紋識別,我把關(guān)鍵部分拿出來,代碼如下: 引入頭文件 指紋識別代碼 調(diào)用test方法,就可以看到app...
    Hardy_Hu閱讀 570評論 2 3
  • 你不知道 我最輕淺的念想 不過是和你一起仰望天堂 有你在的地方,就是天堂 我想,我們下輩子一定會遇到的 那時候,我...
    舊時光終究會老去閱讀 371評論 0 1
  • 西風(fēng)嘯盡白馬歸, 古道樹下空存灰 梵影清落自相隨, 除卻南塵猶未悔
    肖子安閱讀 124評論 2 5