iOS 指紋登錄集成方案
TouchID指紋識別是iPhone 5S設備中增加的一項重大功能.蘋果的後續移動設備也相繼添加了指紋功能,在實際使用中還是相當方便的,比如快捷登錄,快捷支付等等.系統提供了相應框架,使用起來還是比較方便的.使用LAContext對象即可完成指紋識別,提高用戶體驗.
TouchID
提示:指紋識別必須用真機測試,並且在iOS8以上系統.
TouchID API使用
1.添加頭文件
#import
2.判斷系統版本
//首先判斷版本
if(NSFoundationVersionNumber
NSLog(@"系統版本不支持TouchID");
return;
}
3.LAPolicy
在這裡簡單介紹一下LAPolicy,它是一個枚舉.我們根據自己的需要選擇LAPolicy,它提供兩個值:
LAPolicyDeviceOwnerAuthenticationWithBiometrics和LAPolicyDeviceOwnerAuthentication.
. LAPolicyDeviceOwnerAuthenticationWithBiometrics是支持iOS8以上系統,使用該設備的TouchID進行驗證,當輸入TouchID驗證5次失敗後,TouchID被鎖定,只能通過鎖屏後解鎖設備時輸入正確的解鎖密碼來解鎖TouchID。
.LAPolicyDeviceOwnerAuthentication是支持iOS9以上系統,使用該設備的TouchID或設備密碼進行驗證,當輸入TouchID驗證5次失敗後,TouchID被鎖定,會觸發設備密碼頁面進行驗證。
4. canEvaluatePolicy
使用canEvaluatePolicy方法判斷設備是否支持TouchID,返回BOOL為YES,該設備支持TouchID。
if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricserror:&error]) {
error為返回驗證錯誤碼.具體不解釋了.
5. evaluatedPolicyDomainState
context.evaluatedPolicyDomainState用於判斷設備上的指紋是否被更改,在LAContext被創建的時候,evaluatedPolicyDomainState才生效,可在TouchID驗證成功時,將它記錄下來,用於下次使用TouchID時校驗,提高安全性。
6. evaluatePolicy
evaluatePolicy方法是對TouchID進行驗證,Block回調中如果success為YES則驗證成功,為NO驗證失敗,並對error進行解析.
- (IBAction)loginButtonClick:(UIButton*)sender {
//首先判斷版本
if(NSFoundationVersionNumber
NSLog(@"系統版本不支持TouchID");
return;
}
LAContext *context = [[LAContext alloc] init];
context.localizedFallbackTitle =@"輸入密碼";
if(@available(iOS10.0, *)) {
// context.localizedCancelTitle = @"22222";
}else{
// Fallback on earlier versions
}
NSError*error =nil;
if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"通過Home鍵驗證已有手機指紋"reply:^(BOOLsuccess,NSError* _Nullable error) {
if(success) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 驗證成功");
});
}elseif(error){
switch(error.code) {
caseLAErrorAuthenticationFailed:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 驗證失敗");
});
break;
}
caseLAErrorUserCancel:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 被用戶手動取消");
});
}
break;
caseLAErrorUserFallback:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"用戶不使用TouchID,選擇手動輸入密碼");
});
}
break;
caseLAErrorSystemCancel:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 被系統取消 (如遇到來電,鎖屏,按了Home鍵等)");
});
}
break;
caseLAErrorPasscodeNotSet:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 無法啟動,因為用戶沒有設置密碼");
});
}
break;
caseLAErrorTouchIDNotEnrolled:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 無法啟動,因為用戶沒有設置TouchID");
});
}
break;
caseLAErrorTouchIDNotAvailable:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 無效");
});
}
break;
caseLAErrorTouchIDLockout:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"TouchID 被鎖定(連續多次驗證TouchID失敗,系統需要用戶手動輸入密碼)");
});
}
break;
caseLAErrorAppCancel:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"當前軟體被掛起並取消了授權 (如App進入了後台等)");
});
}
break;
caseLAErrorInvalidContext:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"當前軟體被掛起並取消了授權 (LAContext對象無效)");
});
}
break;
default:
break;
}
}
}];
}else{
NSLog(@"當前設備不支持TouchID");
}
}
上面這個代碼, 是整個TouchID的核心,也幾乎是所有代碼了.
驗證
驗證必須使用真機
結果
輸入錯誤的時候
總結:TouchID使用起來不難,重要的是使用流程邏輯.
以登錄為例,一般來說流程是這樣的:
1.開啟指紋登錄:首次登陸使用密碼登錄,登錄後,可以設置一個開啟指紋ID登錄的按鈕,來進行指紋認證.
2.驗證:檢測是否支持TouchID.
3.生成設備賬號/密碼:TouchID驗證通過後,根據當前已登錄的賬號和硬體設備Token,生成設備賬號/密碼(規則可自定,密碼要長要複雜),並保存在keychain;
4.綁定:生成設備賬號/密碼後,將原賬號及設備賬號/密碼,加密後(題主使用的是RSA加密)發送到服務端進行綁定;
5.成功:驗證原賬號及設備賬號有效後,返回相應狀態,綁定成功則完成整個TouchID(設備)綁定流程。
作者:iOS_xuanhe
鏈接:https://www.jianshu.com/p/9990b0f48488
TAG:Cocoa開發者社區 |