[toc]
- [新的博客地址](https://kunnan.blog.csdn.net)
TouchID 指紋識(shí)別是IPhone 5s設(shè)備新增的一項(xiàng)重大功能想鹰,用于數(shù)據(jù)加密和安全。而在IOS 8.0 以后也向第三方開(kāi)放了相應(yīng)功能API
https://developer.apple.com/reference/localauthentication/lacontext?language=objcobjc 語(yǔ)言示例
添加Libraries:LocalAuthentication Framework
Class
LAContext
Preflights an authentication policy to see if it is possible for authentication to succeed.監(jiān)測(cè)設(shè)備是否支持TouchID,返回BOOL,并且若不支持,則在error里面返回相應(yīng)狀態(tài)
-evaluatePolicy:localizedReason:reply:
Evaluates the specified policy.TouchID驗(yàn)證狀態(tài),在block里面返回驗(yàn)證狀態(tài)(BOOL)和error;
reply:(void(^)(BOOLsuccess, NSError *__nullableerror))reply;
The current state of the evaluated policy domain.
TouchID API 非常簡(jiǎn)單宵呛,僅僅對(duì)本設(shè)備的TouchID進(jìn)行驗(yàn)證,但如果需要在app集成相應(yīng)的 “設(shè)備登錄/驗(yàn)證”功能或其他TouchID 的應(yīng)用夕凝,則需自行設(shè)計(jì)關(guān)聯(lián)和綁定流程(例如:設(shè)備Token宝穗、生成設(shè)備賬號(hào)/密碼、app包名/版本)码秉,綁定之后逮矛,才能使用TouchID 進(jìn)行驗(yàn)證和應(yīng)用。
實(shí)現(xiàn)的關(guān)鍵點(diǎn) ?:進(jìn)行設(shè)備(用戶)綁定
由于API并不提供關(guān)于本設(shè)備或本app任何可關(guān)聯(lián)的信息泡徙,所以集成TouchID還需自行設(shè)計(jì)關(guān)聯(lián)流程橱鹏,才能實(shí)現(xiàn)指紋登錄功能,或者指紋支付功能堪藐。
開(kāi)啟TouchID指紋密碼:進(jìn)行設(shè)備(用戶)綁定
關(guān)閉TouchID指紋密碼: 在設(shè)備(用戶)綁定之后莉兰,并且當(dāng)前正處于登錄狀態(tài),也可以將本設(shè)備取消綁定礁竞,流程基本與綁定流程
設(shè)備(指紋)應(yīng)用:
例如登陸應(yīng)用: 在設(shè)備(用戶)綁定之后糖荒,并且用戶賬號(hào)退出后,可以使用指紋登錄模捂,若當(dāng)前設(shè)備未綁定捶朵,則不會(huì)出現(xiàn)“指紋登錄”按鈕蜘矢。
例子:
指紋登陸app (賬號(hào),設(shè)備賬號(hào)/密碼)
賬戶綁定設(shè)備(生成設(shè)備賬號(hào)/密碼)
開(kāi)啟:在app登錄后综看,點(diǎn)擊開(kāi)啟“指紋登錄”品腹;
驗(yàn)證TouchID:檢測(cè)當(dāng)前設(shè)備是否支持TouchID,若支持則發(fā)起TouchID驗(yàn)證红碑;
生成設(shè)備賬號(hào)/密碼:TouchID驗(yàn)證通過(guò)后舞吭,根據(jù)當(dāng)前已登錄的賬號(hào)和硬件設(shè)備Token,生成設(shè)備賬號(hào)/密碼(規(guī)則可自定析珊,密碼要長(zhǎng)要復(fù)雜)羡鸥,并保存在keychain;
綁定:生成設(shè)備賬號(hào)/密碼后忠寻,將原賬號(hào)及設(shè)備賬號(hào)/密碼惧浴,加密后(例如RSA加密)發(fā)送到服務(wù)端進(jìn)行綁定;
成功:驗(yàn)證原賬號(hào)及設(shè)備賬號(hào)有效后奕剃,返回相應(yīng)狀態(tài)衷旅,綁定成功則完成整個(gè)TouchID(設(shè)備)綁定流程。(后臺(tái)處理邏輯)
設(shè)備(指紋)登陸
TouchID登錄:在用戶登錄界面祭饭,點(diǎn)擊“指紋登錄”芜茵;
驗(yàn)證TouchID:檢測(cè)當(dāng)前設(shè)備是否支持TouchID叙量,若支持則發(fā)起TouchID驗(yàn)證倡蝙;
登錄:讀取app在本機(jī)的設(shè)備賬號(hào)/密碼,調(diào)用設(shè)備登錄接口绞佩,發(fā)起登錄請(qǐng)求寺鸥;
成功:驗(yàn)證設(shè)備賬號(hào)/密碼后,返回相應(yīng)狀態(tài)品山,登錄成功則完成整個(gè)TouchID登錄流程胆建。(后臺(tái)處理邏輯)
注意細(xì)節(jié):
生成賬號(hào)/密碼只是隨機(jī)字符,以當(dāng)前userID 為key肘交,保存在keychain笆载;登錄時(shí)候根據(jù)keychain保存的最近一次登錄的userID,獲取賬號(hào)/密碼涯呻,進(jìn)行登錄
附
檢測(cè)系統(tǒng)錄入了新指紋:evaluatedPolicyDomainState這個(gè)屬性凉驻,每次指紋發(fā)生改變的時(shí)候,這個(gè)值就會(huì)變复罐,可以通過(guò)這個(gè)值的變化來(lái)判斷
代碼示例Expand source
#import
-(IBAction)touchIDClick{
LAContext*context=[[LAContext alloc]init];
NSError*error=nil;
if([contextcanEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricserror:&error]){
[contextevaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"驗(yàn)證touchID"
reply:^(BOOL success,NSError*error){
if(error){
NSLog(@"操作失敗");
return;
}
if(success){
NSLog(@"驗(yàn)證成功");
}else{
NSLog(@"驗(yàn)證失敗");
}
}];
}else{
NSLog(@"設(shè)備不支持");
}
}