自從 Apple 大大發(fā)布 iPhone 5s 以后,指紋識別似乎成為了手機的標配,指紋識別的加入使得手機解鎖變得更加方便快捷。iOS 8發(fā)布以后,Apple 大大開放了 Touch ID 給第三方使用,最常見的場景就是應用的登錄,以及日常的支付,提高了應用日常的使用效率。
最近公司項目也準備接入指紋識別,于是花了點時間研究了一下,借機跟大家分享一下心得,如有不妥之處,歡迎指正。
在使用 Touch ID 的時候需要導入系統(tǒng)框架類:
#import <LocalAuthentication/LocalAuthentication.h>
為了展示效果,我只寫了一個按鈕,看效果圖:

首頁.png
點擊按鈕進行指紋驗證,在驗證指紋之前,首先要判斷系統(tǒng)版本是否大于8.0,因為在8.0以后,Touch ID 才開放給第三方使用:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){}
然后要判斷設備是否支持指紋,這一點很重要,如果返回為 NO 會同時返回對應的錯誤,要做進一步處理:
//獲取上下文
LAContext *myContext = [[LAContext alloc] init];
NSError *error = nil;
/*!
*@abstract 判斷設備是否支持指紋識別
*@param LAPolicyDeviceOwnerAuthenticationWithBiometrics 指紋驗證
*@return YES:支持 NO:不支持
*/
if([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){}
這里要說明的是如果返回為 NO,不一定是設備不支持指紋,也有可能是未錄入指紋或者未設置密碼:
NSString *message = @"";
switch (error.code)
{
case LAErrorTouchIDNotEnrolled: /// 支持指紋并已設置密碼,但未錄入指紋
{
message = @"用戶未錄入指紋!";
break;
}
case LAErrorPasscodeNotSet: /// 支持指紋但未設置密碼,并已錄入指紋
{
message = @"設備未設置密碼!";
break;
}
default:
{
message = @"不支持指紋識別!"; /// 不支持指紋
break;
}
}
支持指紋后要進行指紋驗證,這個方法會有一個回調(diào)來告訴開發(fā)者驗證成功還是失敗,如果失敗會返回對應的錯誤:
/*!
*@abstract 指紋驗證以及回調(diào)
*@param LAPolicyDeviceOwnerAuthenticationWithBiometrics 指紋驗證
*@param localizedReason 進行指紋驗證時的彈窗的展示內(nèi)容(該參數(shù)不能為nil或者空串,否則會拋出異常)
*@param reply:驗證后的回調(diào)block
*/
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"通過Home鍵驗證已有指紋"
reply:^(BOOL success, NSError * _Nullable error){}
這里要說明的是如果失敗,返回的錯誤有多種,針對每一種錯誤都要做處理:
switch (error.code)
{
case LAErrorAuthenticationFailed: /// 連續(xù)三次指紋識別錯誤
{
message = @"授權失敗!";
}
break;
case LAErrorUserCancel: /// 在TouchID對話框中點擊了取消按鈕
{
message = @"用戶取消驗證Touch ID!";
}
break;
case LAErrorUserFallback: /// 在TouchID對話框中點擊了輸入密碼按鈕
{
dispatch_async(dispatch_get_main_queue(), ^
{
message = @"用戶選擇輸入密碼!";
});
}
break;
case LAErrorSystemCancel: /// TouchID對話框被系統(tǒng)取消,例如按下Home或者電源鍵
{
message = @"系統(tǒng)取消授權,如其他應用進入前臺,用戶按下Home或者電源鍵!";
}
break;
case LAErrorPasscodeNotSet: /// 已錄入指紋但設備未設置密碼
{
message = @"設備未設置密碼!";
}
break;
case LAErrorTouchIDNotAvailable: /// TouchID不可用
{
message = @"Touch ID不可用!";
}
break;
case LAErrorTouchIDNotEnrolled:/// 用戶未錄入指紋
{
message = @"用戶未錄入指紋!";
}
break;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
case LAErrorTouchIDLockout: /// 連續(xù)五次指紋識別錯誤,TouchID功能被鎖定,下一次需要輸入系統(tǒng)密碼
{
message = @"Touch ID被鎖,需要用戶輸入密碼解鎖!";
}
break;
case LAErrorAppCancel: /// 如突然來了電話,電話應用進入前臺,APP被掛起啦
{
message = @"用戶不能控制情況下APP被掛起!";
}
break;
case LAErrorInvalidContext: /// -10 LAContext傳遞給這個調(diào)用之前已經(jīng)失效
{
message = @"LAContext傳遞給這個調(diào)用之前已經(jīng)失效!";
}
break;
#endif
default:
{
dispatch_async(dispatch_get_main_queue(), ^
{
message = @"其他情況,切換主線程處理!";
});
break;
}
}
整個 Demo 可點擊Touch ID Demo,還望多多支持,點個star?。?!
這里貼出幾張截圖,可對應著看(原諒我不知道怎么并排排列圖片,知道的簡友麻煩評論或私信告知一下,不甚感激! ):

未錄入指紋.jpg

驗證指紋.jpg

取消驗證指紋.jpg

驗證指紋失敗.jpg

三次驗證指紋失敗.jpg

五次驗證指紋失敗.jpg

用戶選擇輸入密碼.jpg

驗證通過.jpg