蘋果在文件中對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時,引入並導入頭文件,書寫代碼!
//指紋識別
-(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.