iOS集成FaceID或TouchID

申請了1個多月的iPhoneX終于到了,今天找機會研究了下如何集成FaceID,然后通過查閱資料,發現和集成TouchID沒多大區別,所以就放到一起講下吧。注:集成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.首先彈出識別的彈窗,當第一次指紋解鎖失敗時彈框會變成兩個按鈕,第二個按鈕可以自定義標題,如上述的代碼的localizedFallbackTitle。另外還可以自定義點擊事件,即上述代碼的if (error.code == kLAErrorUserFallback){ NSLog(@"用戶選擇了另一種方式"); }.輸錯三次密碼會,彈框會消失,此時還可再進行驗證,如若接下來兩次的指紋之別都錯誤的話,此時TouchID會被鎖住,必須得到設置里解鎖才能重新再次識別,TouchID被鎖住的狀態也可以監聽到,如上述代碼的case LAErrorBiometryLockout:{ NSLog(@"TouchID lock out"); break; }

當設備支持FaceID時,此時會調用FaceID識別,注意兩次識別錯誤后彈框才會出現自定義標題的的按鈕選項,設置方式與TouchID相同。5次識別錯誤后,FaceID會被鎖住,也無法再進行識別了,必須到設置里解鎖才能再次進行識別。

2.LAPolicyDeviceOwnerAuthentication 生物識別+密碼認證

針對TouchID。優先調用TouchID識別,如果三次識別錯誤后,則會彈出系統密碼驗證,輸入設備密碼來解鎖。如果不輸入設備密碼,還有兩次機會調用指紋識別,如果都失敗的話,TouchID會被鎖住,則接下來每次調用識別的話,都是調用系統密碼驗證。

當設備支持FaceID時,優先調用FaceID識別,有5次輸入機會,當5次識別失敗后FaceID會被鎖住,之后每次調用識別都會彈出系統密碼驗證

注1:如果沒設置系統密碼,則使用該驗證方式不會調起任何識別,或者說每次都會得到一個錯誤碼LAErrorPasscodeNotSet
注2:無論是LAPolicyDeviceOwnerAuthenticationWithBiometrics還是LAPolicyDeviceOwnerAuthentication最大識別次數都是5次,區別是第二種達到最大次數后才能進行識別,只不過是必須調用系統密碼驗證進行識別。

注意。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;

注意:重點!!該屬性是只讀屬性,也就是說你能獲取當前識別方式是TouchID還是FaceID,而不能手動設置當前識別方式是TouchID還是FaceID。從該屬性我們可以看出,蘋果真實不撞南墻不回頭了,徹底放棄TouchID了,因為如果同時支持兩種識別方式的話,就不會是只讀屬性。你可以根據該屬性進行一些UI上的自定義。

如果想要支持FaceID識別的話,最好加上一個key.
NSFaceIDUsageDescription,我試了下不加的話,確實也不會崩潰,但我覺得為了保險最好加上,防止以后iOS升級后必須要求該key才能進行FaceID識別,而且我相信按照蘋果的尿性,一定會這么做的。

最后

總結一下常見的錯誤碼

kLAErrorUserCancel   用戶取消
kLAErrorPasscodeNotSet  未設置系統密碼
LAErrorBiometryLockout   生物識別被鎖住,指TouchID或FaceID識別次數達到最大次數(5次)
kLAErrorUserFallback  上述所說自定義按鈕標題時,點擊是的錯誤碼,可在此設置自定義的點擊事件
LAErrorSystemCancel  另一個App進入到了前臺
LAErrorTouchIDNotAvailable  TouchID不可用
LAErrorTouchIDNotEnrolled    未設置TouchID
LAErrorTouchIDLockout    TouchID被鎖住 建議判斷LAErrorBiometryLockout即可


參考文章

1.使用TouchID驗證登錄踩過的一些坑(同時更新FaceID使用方法)
2.iOS開發實現TouchID指紋解鎖
3.iOS指紋/密碼鑒定

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 簡述: 在類似支付寶為首的應用以及各種理財等涉及錢財對安全性要求較高的應用中,目前普遍對關鍵數據都做了安全訪問限制...
    C_HPY閱讀 3,029評論 0 18
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • 文/踏歌娘 上一章 鳳九潛入水中,覺得自己似乎是做了一場大夢,現下的日子是她原先想都沒有想過的,他怎么想都覺得有些...
    踏歌娘閱讀 37,395評論 42 87
  • 每一個細節 都有美的瞬間 在神奇的大自然 總有些花花草草 值得我留戀 北方田野 留下你我的足跡 這里 沒有南方的山...
    苛娃閱讀 577評論 0 3
  • 一、php的歷史 1994年 Rasmus Lerdorf用Perl語言的創造,后用C重寫1995年 以Perso...
    百作不死的學習閱讀 463評論 0 2