Touch ID
最近公司的 APP 涉及到指紋識別這塊,之前沒有研究過,現在簡單總結下...
1.基本知識點
1.需要導入 #import <LocalAuthentication/LocalAuthentication.h>
2.注意到這兩個方法
//是否可以用 Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
//用Touch ID后,返回的結果,是否成功
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
3.LAError.h(錯誤的類型)
typedef NS_ENUM(NSInteger, LAError)
{
LAErrorAuthenticationFailed, // 驗證信息出錯,就是說你指紋不對
LAErrorUserCancel // 用戶取消了驗證
LAErrorUserFallback // 用戶點擊了手動輸入密碼的按鈕,所以被取消了
LAErrorSystemCancel // 被系統取消,就是說你現在進入別的應用了,不在剛剛那個頁面,所以沒法驗證
LAErrorPasscodeNotSet // 用戶沒有設置TouchID
LAErrorTouchIDNotAvailable // 用戶設備不支持TouchID
LAErrorTouchIDNotEnrolled // 用戶沒有設置手指指紋
LAErrorTouchIDLockout // 用戶錯誤次數太多,現在被鎖住了
LAErrorAppCancel // 在驗證中被其他app中斷
LAErrorInvalidContext // 請求驗證出錯
} NS_ENUM_AVAILABLE(10_10, 8_0);
4.LAContext 屬性
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(10_12, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic, copy) NSString *localizedReason API_AVAILABLE(macos(10.13), ios(11.0)) API_UNAVAILABLE(watchos, tvos);
localizedFallbackTitle可以設置驗證TouchID時彈出Alert的輸入密碼按鈕的標題
localizedCancelTitle可以設置驗證TouchID時彈出Alert的取消按鈕的標題(iOS10才有)
maxBiometryFailures 最大指紋嘗試錯誤次數。 這個屬性我們可以看到他后面寫了NS_DEPRECATED_IOS(8_3, 9_0),說明這個屬性在iOS 8.3被引入,在iOS 9.0被廢棄,所以如果系統版本高于9.0是無法使用的。
evalueatedPolicyDomainState這個跟可以檢測你的指紋數據庫的變化,增加或者刪除指紋這個屬性會做出相應的反應
touchIDAuthenticationAllowableReuseDuration這個屬性應該是類似于支付寶的指紋開啟應用,如果你打開他解鎖之后,按Home鍵返回桌面,再次進入支付寶是不需要錄入指紋的。因為這個屬性可以設置一個時間間隔,在時間間隔內是不需要再次錄入。默認是0秒,最長可以設置5分鐘。
5.支持機型判斷
從設備和系統判斷是否是支持TouchID
1.是否是iOS8.0以上的系統
2.是否是5s以上的設備支持
2.代碼
if([NSString judueIPhonePlatformSupportTouchID]){
LAContext *la = [[LAContext alloc] init];
la.localizedCancelTitle = @"cancel.."; // 自定義 左邊 title
la.localizedFallbackTitle = @"fallTitle.."; // 自定義 右邊 title
NSError *error;
if([la canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]){
[la evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"手機指紋驗證..." reply:^(BOOL success, NSError * _Nullable error) {
if(success){
NSLog(@"驗證 Success");
}else{
switch (error.code)
{
case LAErrorUserCancel:
//認證被用戶取消.例如點擊了 cancel 按鈕.
NSLog(@"密碼取消");
break;
case LAErrorAuthenticationFailed:
// 此處會自動消失,然后下一次彈出的時候,又需要驗證數字
// 認證沒有成功,因為用戶沒有成功的提供一個有效的認證資格
NSLog(@"連輸三次后,密碼失敗");
break;
case LAErrorPasscodeNotSet:
// 認證不能開始,因為此臺設備沒有設置密碼.
NSLog(@"密碼沒有設置");
break;
case LAErrorSystemCancel:
//認證被系統取消了(例如其他的應用程序到前臺了)
NSLog(@"系統取消了驗證");
break;
case LAErrorUserFallback:
//當輸入覺的會有問題的時候輸入
NSLog(@"登陸");
break;
case LAErrorTouchIDNotAvailable:
//認證不能開始,因為 touch id 在此臺設備尚是無效的.
NSLog(@"touch ID 無效");
default:
NSLog(@"您不能訪問私有內容");
break;
}
}
}];
}else{
switch (error.code) {
case LAErrorTouchIDNotEnrolled:
NSLog(@"您還沒有進行指紋輸入,請指紋設定后打開");
break;
case LAErrorTouchIDNotAvailable:
NSLog(@"您的設備不支持指紋輸入,請切換為數字鍵盤");
break;
case LAErrorPasscodeNotSet:
NSLog(@"您還沒有設置密碼輸入");
break;
default:
break;
}
}
}
完成這篇功能總結,指紋解鎖實現起來還是很簡單的,蘋果都已經封裝好了,簡單實現幾個方法就好。