自從 Apple 大大發(fā)布 iPhone 5s 以后,指紋識別似乎成為了手機(jī)的標(biāo)配,指紋識別的加入使得手機(jī)解鎖變得更加方便快捷。iOS 8發(fā)布以后,Apple 大大開放了 Touch ID 給第三方使用,最常見的場景就是應(yīng)用的登錄,以及日常的支付,提高了應(yīng)用日常的使用效率。
最近公司項(xiàng)目也準(zhǔn)備接入指紋識別,于是花了點(diǎn)時(shí)間研究了一下,借機(jī)跟大家分享一下心得,如有不妥之處,歡迎指正。
在使用 Touch ID 的時(shí)候需要導(dǎo)入系統(tǒng)框架類:
#import <LocalAuthentication/LocalAuthentication.h>
為了展示效果,我只寫了一個(gè)按鈕,看效果圖:
點(diǎn)擊按鈕進(jìn)行指紋驗(yàn)證,在驗(yàn)證指紋之前,首先要判斷系統(tǒng)版本是否大于8.0,因?yàn)樵?.0以后,Touch ID 才開放給第三方使用:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){}
然后要判斷設(shè)備是否支持指紋,這一點(diǎn)很重要,如果返回為 NO 會(huì)同時(shí)返回對應(yīng)的錯(cuò)誤,要做進(jìn)一步處理:
//獲取上下文
LAContext *myContext = [[LAContext alloc] init];
NSError *error = nil;
/*!
*@abstract 判斷設(shè)備是否支持指紋識別
*@param LAPolicyDeviceOwnerAuthenticationWithBiometrics 指紋驗(yàn)證
*@return YES:支持 NO:不支持
*/
if([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){}
這里要說明的是如果返回為 NO,不一定是設(shè)備不支持指紋,也有可能是未錄入指紋或者未設(shè)置密碼:
NSString *message = @"";
switch (error.code)
{
case LAErrorTouchIDNotEnrolled: /// 支持指紋并已設(shè)置密碼,但未錄入指紋
{
message = @"用戶未錄入指紋!";
break;
}
case LAErrorPasscodeNotSet: /// 支持指紋但未設(shè)置密碼,并已錄入指紋
{
message = @"設(shè)備未設(shè)置密碼!";
break;
}
default:
{
message = @"不支持指紋識別!"; /// 不支持指紋
break;
}
}
支持指紋后要進(jìn)行指紋驗(yàn)證,這個(gè)方法會(huì)有一個(gè)回調(diào)來告訴開發(fā)者驗(yàn)證成功還是失敗,如果失敗會(huì)返回對應(yīng)的錯(cuò)誤:
/*!
*@abstract 指紋驗(yàn)證以及回調(diào)
*@param LAPolicyDeviceOwnerAuthenticationWithBiometrics 指紋驗(yàn)證
*@param localizedReason 進(jìn)行指紋驗(yàn)證時(shí)的彈窗的展示內(nèi)容(該參數(shù)不能為nil或者空串,否則會(huì)拋出異常)
*@param reply:驗(yàn)證后的回調(diào)block
*/
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"通過Home鍵驗(yàn)證已有指紋"
reply:^(BOOL success, NSError * _Nullable error){}
這里要說明的是如果失敗,返回的錯(cuò)誤有多種,針對每一種錯(cuò)誤都要做處理:
switch (error.code)
{
case LAErrorAuthenticationFailed: /// 連續(xù)三次指紋識別錯(cuò)誤
{
message = @"授權(quán)失敗!";
}
break;
case LAErrorUserCancel: /// 在TouchID對話框中點(diǎn)擊了取消按鈕
{
message = @"用戶取消驗(yàn)證Touch ID!";
}
break;
case LAErrorUserFallback: /// 在TouchID對話框中點(diǎn)擊了輸入密碼按鈕
{
dispatch_async(dispatch_get_main_queue(), ^
{
message = @"用戶選擇輸入密碼!";
});
}
break;
case LAErrorSystemCancel: /// TouchID對話框被系統(tǒng)取消,例如按下Home或者電源鍵
{
message = @"系統(tǒng)取消授權(quán),如其他應(yīng)用進(jìn)入前臺,用戶按下Home或者電源鍵!";
}
break;
case LAErrorPasscodeNotSet: /// 已錄入指紋但設(shè)備未設(shè)置密碼
{
message = @"設(shè)備未設(shè)置密碼!";
}
break;
case LAErrorTouchIDNotAvailable: /// TouchID不可用
{
message = @"Touch ID不可用!";
}
break;
case LAErrorTouchIDNotEnrolled:/// 用戶未錄入指紋
{
message = @"用戶未錄入指紋!";
}
break;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
case LAErrorTouchIDLockout: /// 連續(xù)五次指紋識別錯(cuò)誤,TouchID功能被鎖定,下一次需要輸入系統(tǒng)密碼
{
message = @"Touch ID被鎖,需要用戶輸入密碼解鎖!";
}
break;
case LAErrorAppCancel: /// 如突然來了電話,電話應(yīng)用進(jìn)入前臺,APP被掛起啦
{
message = @"用戶不能控制情況下APP被掛起!";
}
break;
case LAErrorInvalidContext: /// -10 LAContext傳遞給這個(gè)調(diào)用之前已經(jīng)失效
{
message = @"LAContext傳遞給這個(gè)調(diào)用之前已經(jīng)失效!";
}
break;
#endif
default:
{
dispatch_async(dispatch_get_main_queue(), ^
{
message = @"其他情況,切換主線程處理!";
});
break;
}
}
整個(gè) Demo 可點(diǎn)擊Touch ID Demo,還望多多支持,點(diǎn)個(gè)star!!!
這里貼出幾張截圖,可對應(yīng)著看(原諒我不知道怎么并排排列圖片,知道的簡友麻煩評論或私信告知一下,不甚感激! ):