[toc]
- [新的博客地址](https://kunnan.blog.csdn.net)
TouchID 指紋識別是IPhone 5s設備新增的一項重大功能,用于數據加密和安全。而在IOS 8.0 以后也向第三方開放了相應功能API
https://developer.apple.com/reference/localauthentication/lacontext?language=objcobjc 語言示例
添加Libraries:LocalAuthentication Framework
Class
LAContext
Preflights an authentication policy to see if it is possible for authentication to succeed.監測設備是否支持TouchID,返回BOOL,并且若不支持,則在error里面返回相應狀態
-evaluatePolicy:localizedReason:reply:
Evaluates the specified policy.TouchID驗證狀態,在block里面返回驗證狀態(BOOL)和error;
reply:(void(^)(BOOLsuccess, NSError *__nullableerror))reply;
The current state of the evaluated policy domain.
TouchID API 非常簡單,僅僅對本設備的TouchID進行驗證,但如果需要在app集成相應的 “設備登錄/驗證”功能或其他TouchID 的應用,則需自行設計關聯和綁定流程(例如:設備Token、生成設備賬號/密碼、app包名/版本),綁定之后,才能使用TouchID 進行驗證和應用。
實現的關鍵點 ?:進行設備(用戶)綁定
由于API并不提供關于本設備或本app任何可關聯的信息,所以集成TouchID還需自行設計關聯流程,才能實現指紋登錄功能,或者指紋支付功能。
開啟TouchID指紋密碼:進行設備(用戶)綁定
關閉TouchID指紋密碼: 在設備(用戶)綁定之后,并且當前正處于登錄狀態,也可以將本設備取消綁定,流程基本與綁定流程
設備(指紋)應用:
例如登陸應用: 在設備(用戶)綁定之后,并且用戶賬號退出后,可以使用指紋登錄,若當前設備未綁定,則不會出現“指紋登錄”按鈕。
例子:
指紋登陸app (賬號,設備賬號/密碼)
賬戶綁定設備(生成設備賬號/密碼)
開啟:在app登錄后,點擊開啟“指紋登錄”;
驗證TouchID:檢測當前設備是否支持TouchID,若支持則發起TouchID驗證;
生成設備賬號/密碼:TouchID驗證通過后,根據當前已登錄的賬號和硬件設備Token,生成設備賬號/密碼(規則可自定,密碼要長要復雜),并保存在keychain;
綁定:生成設備賬號/密碼后,將原賬號及設備賬號/密碼,加密后(例如RSA加密)發送到服務端進行綁定;
成功:驗證原賬號及設備賬號有效后,返回相應狀態,綁定成功則完成整個TouchID(設備)綁定流程。(后臺處理邏輯)
設備(指紋)登陸
TouchID登錄:在用戶登錄界面,點擊“指紋登錄”;
驗證TouchID:檢測當前設備是否支持TouchID,若支持則發起TouchID驗證;
登錄:讀取app在本機的設備賬號/密碼,調用設備登錄接口,發起登錄請求;
成功:驗證設備賬號/密碼后,返回相應狀態,登錄成功則完成整個TouchID登錄流程。(后臺處理邏輯)
注意細節:
生成賬號/密碼只是隨機字符,以當前userID 為key,保存在keychain;登錄時候根據keychain保存的最近一次登錄的userID,獲取賬號/密碼,進行登錄
附
檢測系統錄入了新指紋:evaluatedPolicyDomainState這個屬性,每次指紋發生改變的時候,這個值就會變,可以通過這個值的變化來判斷
代碼示例Expand source
#import
-(IBAction)touchIDClick{
LAContext*context=[[LAContext alloc]init];
NSError*error=nil;
if([contextcanEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricserror:&error]){
[contextevaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"驗證touchID"
reply:^(BOOL success,NSError*error){
if(error){
NSLog(@"操作失敗");
return;
}
if(success){
NSLog(@"驗證成功");
}else{
NSLog(@"驗證失敗");
}
}];
}else{
NSLog(@"設備不支持");
}
}