
Touch ID
最近公司的 APP 涉及到指紋識(shí)別這塊,之前沒有研究過,現(xiàn)在簡單總結(jié)下...
1.基本知識(shí)點(diǎn)
1.需要導(dǎo)入 #import <LocalAuthentication/LocalAuthentication.h>
2.注意到這兩個(gè)方法
//是否可以用 Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
//用Touch ID后,返回的結(jié)果,是否成功
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
3.LAError.h(錯(cuò)誤的類型)
typedef NS_ENUM(NSInteger, LAError)
{
LAErrorAuthenticationFailed, // 驗(yàn)證信息出錯(cuò),就是說你指紋不對(duì)
LAErrorUserCancel // 用戶取消了驗(yàn)證
LAErrorUserFallback // 用戶點(diǎn)擊了手動(dòng)輸入密碼的按鈕,所以被取消了
LAErrorSystemCancel // 被系統(tǒng)取消,就是說你現(xiàn)在進(jìn)入別的應(yīng)用了,不在剛剛那個(gè)頁面,所以沒法驗(yàn)證
LAErrorPasscodeNotSet // 用戶沒有設(shè)置TouchID
LAErrorTouchIDNotAvailable // 用戶設(shè)備不支持TouchID
LAErrorTouchIDNotEnrolled // 用戶沒有設(shè)置手指指紋
LAErrorTouchIDLockout // 用戶錯(cuò)誤次數(shù)太多,現(xiàn)在被鎖住了
LAErrorAppCancel // 在驗(yàn)證中被其他app中斷
LAErrorInvalidContext // 請求驗(yàn)證出錯(cuò)
} 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可以設(shè)置驗(yàn)證TouchID時(shí)彈出Alert的輸入密碼按鈕的標(biāo)題
localizedCancelTitle可以設(shè)置驗(yàn)證TouchID時(shí)彈出Alert的取消按鈕的標(biāo)題(iOS10才有)
maxBiometryFailures 最大指紋嘗試錯(cuò)誤次數(shù)。 這個(gè)屬性我們可以看到他后面寫了NS_DEPRECATED_IOS(8_3, 9_0),說明這個(gè)屬性在iOS 8.3被引入,在iOS 9.0被廢棄,所以如果系統(tǒng)版本高于9.0是無法使用的。
evalueatedPolicyDomainState這個(gè)跟可以檢測你的指紋數(shù)據(jù)庫的變化,增加或者刪除指紋這個(gè)屬性會(huì)做出相應(yīng)的反應(yīng)
touchIDAuthenticationAllowableReuseDuration這個(gè)屬性應(yīng)該是類似于支付寶的指紋開啟應(yīng)用,如果你打開他解鎖之后,按Home鍵返回桌面,再次進(jìn)入支付寶是不需要錄入指紋的。因?yàn)檫@個(gè)屬性可以設(shè)置一個(gè)時(shí)間間隔,在時(shí)間間隔內(nèi)是不需要再次錄入。默認(rèn)是0秒,最長可以設(shè)置5分鐘。
5.支持機(jī)型判斷
從設(shè)備和系統(tǒng)判斷是否是支持TouchID
1.是否是iOS8.0以上的系統(tǒng)
2.是否是5s以上的設(shè)備支持
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:@"手機(jī)指紋驗(yàn)證..." reply:^(BOOL success, NSError * _Nullable error) {
if(success){
NSLog(@"驗(yàn)證 Success");
}else{
switch (error.code)
{
case LAErrorUserCancel:
//認(rèn)證被用戶取消.例如點(diǎn)擊了 cancel 按鈕.
NSLog(@"密碼取消");
break;
case LAErrorAuthenticationFailed:
// 此處會(huì)自動(dòng)消失,然后下一次彈出的時(shí)候,又需要驗(yàn)證數(shù)字
// 認(rèn)證沒有成功,因?yàn)橛脩魶]有成功的提供一個(gè)有效的認(rèn)證資格
NSLog(@"連輸三次后,密碼失敗");
break;
case LAErrorPasscodeNotSet:
// 認(rèn)證不能開始,因?yàn)榇伺_(tái)設(shè)備沒有設(shè)置密碼.
NSLog(@"密碼沒有設(shè)置");
break;
case LAErrorSystemCancel:
//認(rèn)證被系統(tǒng)取消了(例如其他的應(yīng)用程序到前臺(tái)了)
NSLog(@"系統(tǒng)取消了驗(yàn)證");
break;
case LAErrorUserFallback:
//當(dāng)輸入覺的會(huì)有問題的時(shí)候輸入
NSLog(@"登陸");
break;
case LAErrorTouchIDNotAvailable:
//認(rèn)證不能開始,因?yàn)?touch id 在此臺(tái)設(shè)備尚是無效的.
NSLog(@"touch ID 無效");
default:
NSLog(@"您不能訪問私有內(nèi)容");
break;
}
}
}];
}else{
switch (error.code) {
case LAErrorTouchIDNotEnrolled:
NSLog(@"您還沒有進(jìn)行指紋輸入,請指紋設(shè)定后打開");
break;
case LAErrorTouchIDNotAvailable:
NSLog(@"您的設(shè)備不支持指紋輸入,請切換為數(shù)字鍵盤");
break;
case LAErrorPasscodeNotSet:
NSLog(@"您還沒有設(shè)置密碼輸入");
break;
default:
break;
}
}
}
完成這篇功能總結(jié),指紋解鎖實(shí)現(xiàn)起來還是很簡單的,蘋果都已經(jīng)封裝好了,簡單實(shí)現(xiàn)幾個(gè)方法就好。