【源碼】iOS指紋解鎖Touch ID的開發

指紋解鎖原理:

蘋果在文件中對iPhone 5S配備的Touch ID指紋識別系統的功能與工做原理進行了詳細說明。文件對iPhone 5S的A7處理器中「「Secure Enclave」」協處理器進行了說明,該協處理器可以安全地將用戶儲存的指紋信息與Touch ID當前所識別到的指紋進行信息對比。而蘋果早在iPhone 5S發佈時就公佈了Touch ID的工做原理。但這次所獲悉的文件說明得更爲詳細。安全

根據蘋果的解釋,一個單一的註冊指紋與別人指紋出現隨機匹配的機率爲五萬分之一。app

蘋果聲稱「「Secure Enclave」」模塊系統可以安全地管理並識別用戶的指紋,並將用戶的指紋信息獨立地保存在別的系統中,同時經過加密內存和一個硬件隨機數字密碼發生器進行管理。iphone

每一個「Secure Enclave」是單獨設置的,不能訪問系統其餘部分的,擁有本身的獨立的UID(惟一的ID),連蘋果也不知道這些UID。當設備啓動時,Touch ID會臨時建立一個祕鑰,與「Secure Enclave」的UID配合,對設備的內存空間進行加密。this

而在蘋果發佈的文件中,蘋果對A7處理器進行指紋識別受權的描述是:A7和Touch ID之間經過一個串行外設接口總線進行通訊。A7處理器將數據發到「Secure Enclave」,但並不對數據內容進行讀取。加密和身份驗證都是使用Touch ID和「Secure Enclave」之間的共享密鑰。通訊密鑰交換使用雙方提供的一個隨機AES密鑰,並隨機創建會話密鑰和使用AES-CCM傳輸加密。加密

因爲大部分的Touch ID用戶可能發現,在某些狀況下須要使用密碼來代替Touch ID。而這份文件指出了什麼狀況下Touch ID不能使用和要求必須輸入密碼:lua

文件指出在如下狀況下密碼能夠代替Touch ID:3d

-iPhone 5s剛剛開啓或從新啓動時;code

-iPhone 5s沒有解鎖超過48小時;blog

-通過5次不成功指紋匹配時;接口

-當進行設置或使用新的手指紋使用Touch ID時;

-iPhone 5s已經接收到遠程鎖定命令時。

指紋解鎖代碼實現:

 

因此咱們一開始須要判斷當前系統版本

 


低於8.0的系統版本不支持指紋解鎖

當系統版本大於8.0時,引入並導入頭文件,書寫代碼!

 

 
 
 

//指紋識別

-(void)safeToFaceID

{

    if ([[UIDevice currentDevice] systemVersion].floatValue > 8.0) {

        //新建LAContext實例

        LAContext  *authenticationContext= [[LAContext alloc]init];

        NSError *error;

 

        //LAPolicyDeviceOwnerAuthentication

        //1:檢查Touch ID 是否可用

        if ([authenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {

            NSLog(@"touchId 可用");

            //2:執行認證策略

            [authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"請輸入您的指紋進入應用" reply:^(BOOL success, NSError * _Nullable error) {

                if (success) {

                    NSLog(@"經過了Touch Id指紋驗證");

                }else{

                    if (error.code == -2) {//點擊了取消按鈕

                        NSLog(@"點擊了取消按鈕");

                        NSLog (@"****** exit******");

                        exit (0);

                    }else if (error.code == -4){//按下電源鍵

                        NSLog(@"按下電源鍵");

                        NSLog (@"****** exit******");

                        exit (0);

                    }

                    //                else if (error.code == -7){//在有TouchID 的功能下,沒有設置TouchID的運行結果

                    //                else if (error.code == -6){//在iphone5上運行結果(沒有指紋解鎖功能)

                    //                else if (error.code == -8){//輸入錯誤3次

                    //                else if (error.code == -1){//連續三次指紋識別錯誤

                    //                NSLog(@"未經過Touch Id指紋驗證,錯誤描述: %@---", error.description);

                }

            }];

        }else{//Touch ID功能被鎖定,下一次須要輸入系統密碼

            NSLog(@"touchId 不可用");

            NSLog(@"error====%@",error.description);

            //提示用戶不可用

            //        ?????

        }

        return;

    }

}

 

如下是常常出現的幾個錯誤,你們共勉!

例如,在iphone5上運行結果:

Error Domain=com.apple.LocalAuthentication Code=-6 "Biometry is not available on this device." UserInfo=0x15ec5a00 {NSLocalizedDescription=Biometry is not available on this device.

例如,在模擬器上運行結果:

Error Domain=com.apple.LocalAuthentication Code=-1000 "Simulator is not supported." UserInfo=0x7ffe604b0790 {NSLocalizedDescription=Simulator is not supported.

例如,在有TouchID 的功能下,沒有設置TouchID的運行結果:

Error Domain=com.apple.LocalAuthentication Code=-7 "No fingers are enrolled with Touch ID." UserInfo=0x170075fc0 {NSLocalizedDescription=No fingers are enrolled with Touch ID.

例如:連續三次指紋識別錯誤:

Error Domain=com.apple.LocalAuthentication Code=-1 "Aplication retry limit exceeded." UserInfo=0x1740797c0 {NSLocalizedDescription=Aplication retry limit exceeded.}

例如:用戶在Touch ID對話框中點擊了取消按鈕:

Error Domain=com.apple.LocalAuthentication Code=-2 "Canceled by user." UserInfo=0x17006c780 {NSLocalizedDescription=Canceled by user.

例如:用戶在Touch ID對話框中點擊輸入密碼按鈕:

Error Domain=com.apple.LocalAuthentication Code=-3 "Fallback authentication mechanism selected." UserInfo=0x17407e040 {NSLocalizedDescription=Fallback authentication mechanism selected.

例如:按下電源鍵:

Error Domain=com.apple.LocalAuthentication Code=-4 "UI canceled by system." UserInfo=0x170065900 {NSLocalizedDescription=UI canceled by system.}

例如:Touch ID功能被鎖定,下一次須要輸入系統密碼時的運行結果:

Error Domain=com.apple.LocalAuthentication Code=-8 "Biometry is locked out." UserInfo={NSLocalizedDescription=Biometry is locked out.

相關文章
相關標籤/搜索