1. 手勢
手勢的代碼有很多,可以參考支付寶或者其他人寫的。
手勢/指紋登陸是為了省去輸入密碼的麻煩。參考了中國銀行信用卡App --"繽紛生活",截圖如下
1. 在登陸成功的情況下才能進入 “設置-賬號與安全” 設置手勢/指紋,未登陸時 見圖10
2. 登陸成功時會提示你是否設置輔助登陸密碼,也就是手勢/指紋 ,見圖1
3. 在“設置-賬號與安全” 中點擊開關,會進入到密碼驗證,如果已有手勢,則彈出手勢驗證,見圖2,3,4,5
4. 手勢繪制需要重復繪制2次,錄入成功之后回到開關界面,開關打開,見圖6
5. 圖8,是殺掉App,再次打開App,可見用戶數據都清空了
6. 圖9,有注冊,切換登錄方式這兩個,目的就是為了給不同賬號登陸
再看這個,我關閉了所有網絡,此時用手勢快捷登陸,會提示網絡故障,由此可以看看出,手勢驗證成功之后,他立即發送了一個登陸的請求。
包括圖9中這個用戶名,可能還有密碼,都會存入沙盒。
2. 指紋
而指紋驗證,驗證成功了在沙盒存一個標志就可以了。
一般指紋驗證的時候3次失敗了,會有有一個失敗的回調,指紋彈窗消失,需要重新使用evaluatePolicy...方法喚起彈窗。5次失敗則需要輸入手機密碼,然后再次喚起彈窗。
注意使用evaluatePolicy...方法的回調里面如果要操作UI,一定要切換回主線程。
這里參考https://github.com/ITHanYong/TouchID.git把指紋驗證的代碼封裝到一個管理類中,然后回調用通知發出去。在使用的地方,就是要彈出的地方調用就可以了。少走很多彎路。
TouchIDManager.h

// // WLFTouchIDManager.h // WLFApp // // Created by udc on 2020/1/10. // Copyright © 2020 xxx. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface WLFTouchIDManager : NSObject // 當識別出現每一種情況是會發出通知 + (void)validateTouchID; @end /* * 授權成功 */ UIKIT_EXTERN NSString *const ValidateTouchIDSuccess; /* * 取消按鈕 */ UIKIT_EXTERN NSString *const ValidateTouchIDCancel; /* * 輸入密碼 */ UIKIT_EXTERN NSString *const ValidateTouchIDInputPassword; /* * 授權失敗 */ UIKIT_EXTERN NSString *const ValidateTouchIDAuthenticationFailed; /* * 設備不可用 */ UIKIT_EXTERN NSString *const ValidateTouchIDNotAvailable; /* * 設備未設置指紋 */ UIKIT_EXTERN NSString *const ValidateTouchIDNotEnrolled; /* * 設備未設置密碼 */ UIKIT_EXTERN NSString *const ValidateTouchIDErrorPasscodeNotSet; /* * 指紋設備被鎖定 */ UIKIT_EXTERN NSString *const ValidateTouchIDLockout; NS_ASSUME_NONNULL_END
TouchIDManager.m

// // WLFTouchIDManager.m // WLFApp // // Created by udc on 2020/1/10. // Copyright © 2020 xxx. All rights reserved. // #import "WLFTouchIDManager.h" #import <LocalAuthentication/LocalAuthentication.h> #define DeviceVersion [[UIDevice currentDevice]systemVersion].doubleValue /* * 授權成功 */ NSString *const ValidateTouchIDSuccess = @"ValidateTouchIDSuccess"; /* * 取消按鈕 */ NSString *const ValidateTouchIDCancel = @"ValidateTouchIDCancel"; /* * 輸入密碼 */ NSString *const ValidateTouchIDInputPassword = @"ValidateTouchIDInputPassword"; /* * 授權失敗 */ NSString *const ValidateTouchIDAuthenticationFailed = @"ValidateTouchIDAuthenticationFailed"; /* * 設備指紋不可用 */ NSString *const ValidateTouchIDNotAvailable = @"ValidateTouchIDNotAvailable"; /* * 設備未設置指紋 */ NSString *const ValidateTouchIDNotEnrolled = @"ValidateTouchIDNotEnrolled"; /* * 設備未設置密碼 */ NSString *const ValidateTouchIDErrorPasscodeNotSet = @"ValidateTouchIDErrorPasscodeNotSet"; /* * 指紋設備被鎖定 */ NSString *const ValidateTouchIDLockout = @"ValidateTouchIDLockout"; @implementation WLFTouchIDManager + (void)validateTouchID { // 判斷系統是否是iOS8.0以上 8.0以上可用 if (!([[UIDevice currentDevice]systemVersion].doubleValue >= 8.0)) { NSLog(@"系統不支持"); return; } // 創建LAContext對象 LAContext *authenticationContext = [[LAContext alloc]init]; NSError *error = nil; authenticationContext.localizedFallbackTitle = @""; [authenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]; if (error.code == LAErrorTouchIDLockout && DeviceVersion >= 9.0) { [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDLockout object:nil]; [authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"重新開啟TouchID功能" reply:^(BOOL success, NSError * _Nullable error) { if (success) { [self validateTouchID]; } }]; return; } [authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"通過Home鍵驗證已有手機指紋" reply:^(BOOL success, NSError * _Nullable error) { dispatch_async(dispatch_get_main_queue(), ^{ // 指紋識別錯誤調用分為以下情況, // 點擊取消按鈕 : domain = com.apple.LocalAuthentication code = -2 // 點擊輸入密碼按鈕 : domain = com.apple.LocalAuthentication code = -3 // 輸入密碼重新進入指紋系統 : domain = com.apple.LocalAuthentication code = -8 // 指紋三次錯誤 : domain = com.apple.LocalAuthentication code = -1 // 指紋驗證成功 : error = nil if (error) { switch (error.code) { case LAErrorAuthenticationFailed: NSLog(@"LAErrorAuthenticationFailed");//-1 [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDAuthenticationFailed object:nil]; break; case LAErrorUserCancel: // 點擊取消按鈕 [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDCancel object:nil]; break; case LAErrorUserFallback: // 用戶點擊輸入密碼按鈕 [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDInputPassword object:nil]; break; case LAErrorPasscodeNotSet: //沒有在設備上設置密碼 [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDErrorPasscodeNotSet object:nil]; break; case LAErrorTouchIDNotAvailable: [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDNotAvailable object:nil]; //設備不支持TouchID break; case LAErrorTouchIDNotEnrolled: [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDNotEnrolled object:nil]; break; //設備沒有注冊TouchID case LAErrorTouchIDLockout: [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDLockout object:nil]; if (DeviceVersion >= 9.0) { [self validateTouchID]; } break; default: break; } return ; } // 說明驗證成功,如果要刷新UI必須在這里回到主線程 [[NSNotificationCenter defaultCenter]postNotificationName:ValidateTouchIDSuccess object:nil]; }); }]; } @end