Touch ID指紋識別作為iPhone 5s上的“殺手級”功能早已為人們所熟知,目前搭載的設備有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開放了指紋驗證的API,為APP增添了新的解鎖姿勢,Touch ID在iPhone 6、iPhone 6 Plus上表現平平,識別效率低下成為眾多用戶的吐槽點 蘋果在2015新品發布會上提及全新的iPhone 6s、iPhone 6s Plus采用第二代Touch ID,新的Touch ID識別速度更快;實際體驗中只要輕輕觸碰一下即可,以往要按壓半秒鐘的指紋識別過程,現在基本是一觸即發 隨著安卓也有越來越多的設備配備了類似Touch ID的指紋識別裝置,今後會有越來越多的APP選擇使用指紋識別的驗證方式
Touch ID原理
Touch ID不存儲用戶的任何指紋圖像,只保存代表指紋的數字字符。iPhone 5s的A7處理器采用了新的高級安全架構,其中有一塊名為Secure Enclave的區域用以專門保護密碼和指紋數據。只有Secure Enclave可以訪問指紋數據,而且它還把這些數據同處理器和系統隔開,因而這些永遠不會被存儲在蘋果的服務器上,也不會被同步到iCloud或其他地方。除了Touch ID之外,它們不會被匹配到其他指紋庫中 相信很多人都知道,一個Touch ID傳感器和iPhone是一對一的關系,如果損壞,只能售後,無法自行更換,其中的原理比較復雜。一種可能的解釋是蘋果阻止了任何Touch ID和Secure Enclave之間的任何數據嗅探和截取,實現了特定處理器配對特定的Touch ID。 如果可以隨意更換,那麼有人將用戶的指紋傳感器更換,就可以在用戶不知情的情況下竊取到指紋數據。蘋果的技術降低了這一風險,這意味著不法之徒想要調包傳感器的話,需要單獨破解每台設備,對於重視安全性的用戶來說,這個發現當然是個好消息
Touch ID常用方法與枚舉解釋
首先蘋果提供了
canEvaluatePolicy:error:來判斷運行的設備是否支持Touch ID
如果要讓其失效,可以調用
invalidate,新特征:iOS 9.0和Mac OS 10.11
還提供了
evaluatePolicy:localizedReason:reply:來驗證識別的情況,具體類型如下(以下枚舉類型出現的情況均已測試並標注):
// 身份驗證沒有成功,因為用戶未能提供有效的憑據(連續3次驗證失敗時提示)
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
// 身份驗證被用戶取消(當用戶點擊取消按鈕時提示)
LAErrorUserCancel = kLAErrorUserCancel,
// 認證被取消了,因為用戶點擊回退按鈕(當用戶點擊輸入密碼時提示)
LAErrorUserFallback = kLAErrorUserFallback,
// 身份驗證被系統取消(驗證時當前APP被移至後台或者點擊了home鍵導致驗證退出時提示)
LAErrorSystemCancel = kLAErrorSystemCancel,
// Touch ID無法啟動,因為沒有設置密碼(當系統沒有設置密碼的時候,Touch ID也將不會開啟)
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
// 無法啟動身份驗證(這種情況沒有檢測到,應該是出現硬件損壞才會出現)
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable,
// 無法啟動身份驗證,因為觸摸沒有注冊的手指 (這個暫時沒檢測到)
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
// 身份驗證是不成功的,因為有太多的失敗會要求密碼解除鎖定,(前提是使用 LAPolicyDeviceOwnerAuthenticationWithBiometrics)iOS9和MAC OS0.11新特征
LAErrorTouchIDLockout NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout,
// 認證被取消的應用(如無效而認證進行調用)這個暫時沒有檢測到,可能是蘋果預留的 iOS9和MAC OS0.11新特征
LAErrorAppCancel NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
// LAContext通過這個電話已經失效(當LAContext失效時會調用)iOS9和MAC OS0.11新特征
LAErrorInvalidContext NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext
Touch 使用
首先,我們需要引入
LocalAuthentication 框架
#import
使用很簡單,先創建一個
LAContext對象並配置必要的信息
LAContext *context = [[LAContext alloc] init];
// 當指紋識別失敗一次後,彈框會多出一個選項,而這個屬性就是用來設置那個選項的內容
context.localizedFallbackTitle = @"使用密碼登錄";
配置好LAContext對象後,就需要判斷一下設備
是否支持指紋識別功能
NSError *error = nil;
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) { // 該設備支持指紋識別
}else {
}
當設備支持指紋識別的時候,實現如下
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"身份驗證需要解鎖指紋識別功能" reply:^(BOOL success, NSError * _Nullable error) {
if (success) { // 驗證成功
}else {
NSLog(@"%@", error.localizedDescription);
switch (error.code) {
case LAErrorSystemCancel:
NSLog(@"身份驗證被系統取消(驗證時當前APP被移至後台或者點擊了home鍵導致驗證退出時提示)");
break;
case LAErrorUserCancel:
NSLog(@"身份驗證被用戶取消(當用戶點擊取消按鈕時提示)");
break;
case LAErrorAuthenticationFailed:
NSLog(@"身份驗證沒有成功,因為用戶未能提供有效的憑據(連續3次驗證失敗時提示)");
break;
case LAErrorPasscodeNotSet:
NSLog(@"Touch ID無法啟動,因為沒有設置密碼(當系統沒有設置密碼的時候,Touch ID也將不會開啟)");
break;
case LAErrorTouchIDNotAvailable:
NSLog(@"無法啟動身份驗證"); // 這個沒有檢測到,應該是出現硬件損壞才會出現
break;
case LAErrorTouchIDNotEnrolled:
NSLog(@"無法啟動身份驗證,因為觸摸標識沒有注冊的手指"); // 這個暫時沒檢測到
break;
case LAErrorUserFallback:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"用戶選擇輸入密碼,切換主線程處理");
}];
break;
}
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"其他情況,切換主線程處理"); // 5次失敗進入,如果繼續驗證,則需要輸入密碼解鎖
}];
break;
}
}
}
}
];
如果不支持,實現如下
NSLog(@"不支持指紋識別");
switch (error.code) {
case LAErrorTouchIDNotEnrolled:
NSLog(@"設備Touch ID不可用");
break;
case LAErrorPasscodeNotSet:
NSLog(@"系統未設置密碼");
break;
default:
NSLog(@"TouchID不可用或已損壞");
break;
}
NSLog(@"%@", error.localizedDescription);
github-Demo下載請點我