申請了1個多月的iPhoneX終于到了签餐,今天找機會研究了下如何集成FaceID,然后通過查閱資料寓涨,發(fā)現(xiàn)和集成TouchID沒多大區(qū)別,所以就放到一起講下吧氯檐。注:集成FaceID的方式戒良、代碼基本與集成TouchID一致。
如何集成TouchID
官方API文檔
https://developer.apple.com/documentation/localauthentication?language=objc
1.首先引入文件
#import <LocalAuthentication/LocalAuthentication.h>
完整代碼如下
LAContext *context = [LAContext new];
NSError *error;
context.localizedFallbackTitle = @"輸入密碼";
if ([context canEvaluatePolicy:(LAPolicyDeviceOwnerAuthenticationWithBiometrics) error:&error]){
NSLog(@"支持使用");
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"通過驗證指紋解鎖",nil) reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"驗證成功");
}else{
if (error.code == kLAErrorUserFallback){
NSLog(@"用戶選擇了另一種方式");
}else if (error.code == kLAErrorUserCancel){
NSLog(@"用戶取消");
}else if (error.code == kLAErrorSystemCancel){
NSLog(@"切換前臺被取消");
}else if (error.code == kLAErrorPasscodeNotSet){
NSLog(@"身份驗證沒有設置");
}else{
NSLog(@"驗證失敗");
}
}
}];
}else{
switch (error.code) {
case LAErrorBiometryNotEnrolled:{
NSLog(@"TouchID is not enrolled");
break;
}
case LAErrorPasscodeNotSet:{
NSLog(@"A passcode has not been set");
break;
}
case LAErrorBiometryLockout:{
NSLog(@"TouchID lock out");
break;
}
default:{
NSLog(@"TouchID not available");
break;
}
}
}
代碼解釋如下
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
判斷是否支持TouchID或FaceID
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
調用授權冠摄,如果支持TouchID則彈出指紋識別糯崎,支持FaceID則彈出面容識別
LAPolicy 鑒定方式
有兩種鑒定方式
1.LAPolicyDeviceOwnerAuthenticationWithBiometrics
生物識別
針對TouchID.首先彈出識別的彈窗,當?shù)谝淮沃讣y解鎖失敗時彈框會變成兩個按鈕耗拓,第二個按鈕可以自定義標題拇颅,如上述的代碼的localizedFallbackTitle奏司。另外還可以自定義點擊事件乔询,即上述代碼的
if (error.code == kLAErrorUserFallback){ NSLog(@"用戶選擇了另一種方式"); }
.輸錯三次密碼會,彈框會消失韵洋,此時還可再進行驗證竿刁,如若接下來兩次的指紋之別都錯誤的話黄锤,此時TouchID會被鎖住,必須得到設置里解鎖才能重新再次識別食拜,TouchID被鎖住的狀態(tài)也可以監(jiān)聽到鸵熟,如上述代碼的case LAErrorBiometryLockout:{ NSLog(@"TouchID lock out"); break; }
當設備支持FaceID時,此時會調用FaceID識別负甸,注意兩次識別錯誤后彈框才會出現(xiàn)自定義標題的的按鈕選項,設置方式與TouchID相同流强。5次識別錯誤后,F(xiàn)aceID會被鎖住呻待,也無法再進行識別了打月,必須到設置里解鎖才能再次進行識別。
2.LAPolicyDeviceOwnerAuthentication
生物識別+密碼認證
針對TouchID蚕捉。優(yōu)先調用TouchID識別奏篙,如果三次識別錯誤后,則會彈出系統(tǒng)密碼驗證迫淹,輸入設備密碼來解鎖秘通。如果不輸入設備密碼,還有兩次機會調用指紋識別敛熬,如果都失敗的話肺稀,TouchID會被鎖住,則接下來每次調用識別的話荸型,都是調用系統(tǒng)密碼驗證盹靴。
當設備支持FaceID時,優(yōu)先調用FaceID識別,有5次輸入機會瑞妇,當5次識別失敗后FaceID會被鎖住稿静,之后每次調用識別都會彈出系統(tǒng)密碼驗證
注1:如果沒設置系統(tǒng)密碼,則使用該驗證方式不會調起任何識別辕狰,或者說每次都會得到一個錯誤碼LAErrorPasscodeNotSet
注2:無論是LAPolicyDeviceOwnerAuthenticationWithBiometrics
還是LAPolicyDeviceOwnerAuthentication
最大識別次數(shù)都是5次,區(qū)別是第二種達到最大次數(shù)后才能進行識別改备,只不過是必須調用系統(tǒng)密碼驗證進行識別。
注意蔓倍。context.localizedFallbackTitle = @"自定義";如果未設置該title的話悬钳,則AlertView彈窗默認會有“輸入密碼”的選項,但是在
LAPolicyDeviceOwnerAuthenticationWithBiometrics
模式下點擊“輸入密碼”不會有反應偶翅;LAPolicyDeviceOwnerAuthentication
模式下點擊可以喚起輸入手機密碼頁面默勾。如果設置該title為空值,則彈框不會有該選項聚谁,如果設置該值不為空母剥,則彈框會有該選項,且點擊事件需要自定義,在判斷錯誤碼code為kLAErrorUserFallback的代碼塊內設置自定義事件环疼。
如何集成FaceID
其實集成FaceID的方式已經寫在上面了习霹,別奇怪,代碼一模一樣炫隶。不需要做任何改變淋叶。如果你需要判斷當前識別方式是TouchID還是FaceID的話,LAContext實例類有個只讀屬性叫biometryType
伪阶。定義如下
typedef NS_ENUM(NSInteger, LABiometryType)
{
/// The device does not support biometry.
LABiometryNone,
/// The device supports Touch ID.
LABiometryTypeTouchID,
/// The device supports Face ID.
LABiometryTypeFaceID,
} NS_ENUM_AVAILABLE(NA, 11_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
注意:重點I烽荨!該屬性是只讀屬性栅贴,也就是說你能獲取當前識別方式是TouchID還是FaceID,而不能手動設置當前識別方式是TouchID還是FaceID形娇。從該屬性我們可以看出,蘋果真實不撞南墻不回頭了筹误,徹底放棄TouchID了桐早,因為如果同時支持兩種識別方式的話,就不會是只讀屬性厨剪。你可以根據(jù)該屬性進行一些UI上的自定義哄酝。
如果想要支持FaceID識別的話,最好加上一個key.
NSFaceIDUsageDescription
祷膳,我試了下不加的話陶衅,確實也不會崩潰,但我覺得為了保險最好加上直晨,防止以后iOS升級后必須要求該key才能進行FaceID識別搀军,而且我相信按照蘋果的尿性,一定會這么做的勇皇。
最后
總結一下常見的錯誤碼
kLAErrorUserCancel 用戶取消
kLAErrorPasscodeNotSet 未設置系統(tǒng)密碼
LAErrorBiometryLockout 生物識別被鎖住罩句,指TouchID或FaceID識別次數(shù)達到最大次數(shù)(5次)
kLAErrorUserFallback 上述所說自定義按鈕標題時,點擊是的錯誤碼,可在此設置自定義的點擊事件
LAErrorSystemCancel 另一個App進入到了前臺
LAErrorTouchIDNotAvailable TouchID不可用
LAErrorTouchIDNotEnrolled 未設置TouchID
LAErrorTouchIDLockout TouchID被鎖住 建議判斷LAErrorBiometryLockout即可
參考文章
1.使用TouchID驗證登錄踩過的一些坑(同時更新FaceID使用方法)
2.iOS開發(fā)實現(xiàn)TouchID指紋解鎖
3.iOS指紋/密碼鑒定