自從 Apple 大大發(fā)布 iPhone 5s 以后州疾,指紋識(shí)別似乎成為了手機(jī)的標(biāo)配鞭铆,指紋識(shí)別的加入使得手機(jī)解鎖變得更加方便快捷玫恳。iOS 8發(fā)布以后矛市,Apple 大大開(kāi)放了 Touch ID 給第三方使用芙沥,最常見(jiàn)的場(chǎng)景就是應(yīng)用的登錄,以及日常的支付浊吏,提高了應(yīng)用日常的使用效率而昨。
最近公司項(xiàng)目也準(zhǔn)備接入指紋識(shí)別,于是花了點(diǎn)時(shí)間研究了一下找田,借機(jī)跟大家分享一下心得歌憨,如有不妥之處,歡迎指正墩衙。
在使用 Touch ID 的時(shí)候需要導(dǎo)入系統(tǒng)框架類(lèi):
#import <LocalAuthentication/LocalAuthentication.h>
為了展示效果务嫡,我只寫(xiě)了一個(gè)按鈕,看效果圖:
點(diǎn)擊按鈕進(jìn)行指紋驗(yàn)證漆改,在驗(yàn)證指紋之前心铃,首先要判斷系統(tǒng)版本是否大于8.0,因?yàn)樵?.0以后挫剑,Touch ID 才開(kāi)放給第三方使用:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){}
然后要判斷設(shè)備是否支持指紋去扣,這一點(diǎn)很重要,如果返回為 NO 會(huì)同時(shí)返回對(duì)應(yīng)的錯(cuò)誤暮顺,要做進(jìn)一步處理:
//獲取上下文
LAContext *myContext = [[LAContext alloc] init];
NSError *error = nil;
/*!
*@abstract 判斷設(shè)備是否支持指紋識(shí)別
*@param LAPolicyDeviceOwnerAuthenticationWithBiometrics 指紋驗(yàn)證
*@return YES:支持 NO:不支持
*/
if([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){}
這里要說(shuō)明的是如果返回為 NO厅篓,不一定是設(shè)備不支持指紋秀存,也有可能是未錄入指紋或者未設(shè)置密碼:
NSString *message = @"";
switch (error.code)
{
case LAErrorTouchIDNotEnrolled: /// 支持指紋并已設(shè)置密碼捶码,但未錄入指紋
{
message = @"用戶未錄入指紋羽氮!";
break;
}
case LAErrorPasscodeNotSet: /// 支持指紋但未設(shè)置密碼,并已錄入指紋
{
message = @"設(shè)備未設(shè)置密碼惫恼!";
break;
}
default:
{
message = @"不支持指紋識(shí)別档押!"; /// 不支持指紋
break;
}
}
支持指紋后要進(jìn)行指紋驗(yàn)證,這個(gè)方法會(huì)有一個(gè)回調(diào)來(lái)告訴開(kāi)發(fā)者驗(yàn)證成功還是失敗祈纯,如果失敗會(huì)返回對(duì)應(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:@"通過(guò)Home鍵驗(yàn)證已有指紋"
reply:^(BOOL success, NSError * _Nullable error){}
這里要說(shuō)明的是如果失敗,返回的錯(cuò)誤有多種腕窥,針對(duì)每一種錯(cuò)誤都要做處理:
switch (error.code)
{
case LAErrorAuthenticationFailed: /// 連續(xù)三次指紋識(shí)別錯(cuò)誤
{
message = @"授權(quán)失斄C弧!";
}
break;
case LAErrorUserCancel: /// 在TouchID對(duì)話框中點(diǎn)擊了取消按鈕
{
message = @"用戶取消驗(yàn)證Touch ID簇爆!";
}
break;
case LAErrorUserFallback: /// 在TouchID對(duì)話框中點(diǎn)擊了輸入密碼按鈕
{
dispatch_async(dispatch_get_main_queue(), ^
{
message = @"用戶選擇輸入密碼癞松!";
});
}
break;
case LAErrorSystemCancel: /// TouchID對(duì)話框被系統(tǒng)取消,例如按下Home或者電源鍵
{
message = @"系統(tǒng)取消授權(quán)入蛆,如其他應(yīng)用進(jìn)入前臺(tái)响蓉,用戶按下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ù)五次指紋識(shí)別錯(cuò)誤扼褪,TouchID功能被鎖定想幻,下一次需要輸入系統(tǒng)密碼
{
message = @"Touch ID被鎖,需要用戶輸入密碼解鎖话浇!";
}
break;
case LAErrorAppCancel: /// 如突然來(lái)了電話举畸,電話應(yīng)用進(jìn)入前臺(tái),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è)starL6B收酢!
這里貼出幾張截圖露戒,可對(duì)應(yīng)著看(原諒我不知道怎么并排排列圖片椒功,知道的簡(jiǎn)友麻煩評(píng)論或私信告知一下捶箱,不甚感激! ):