iOS 生物校驗(Face ID / Touch ID)

驗證方式

  • LAPolicyDeviceOwnerAuthenticationWithBiometrics

iOS8.0以上支持,只有生物校驗功能

生物校驗授權(quán)使用,當設備不具有Touch ID / Face Id 功能,或者在系統(tǒng)設置中沒有設置開啟生物校驗,授權(quán)將會失敗。

前三次生物校驗失敗,生物校驗框不再彈出。再次重新進入驗證,還有兩次驗證機會,如果還是驗證失敗,Touch ID(Face ID)被鎖住不再繼續(xù)彈出生物校驗框。以后的每次驗證都將會彈出設備密碼輸入框直至輸入正確的設備密碼才能重新使用生物校驗

  • LAPolicyDeviceOwnerAuthentication

iOS 9.0以上支持,包含生物校驗與輸入密碼的驗證方式

生物校驗和數(shù)字密碼的授權(quán)使用,當生物校驗可用且沒有被鎖定,授權(quán)后會進入生物校驗。不然的話會進入數(shù)字密碼驗證的頁面。當系統(tǒng)數(shù)字密碼沒有設置不可用的時候,授權(quán)失敗。

生物校驗失敗三次將彈出設備密碼輸入框,如果不進行密碼輸入。再次進來還可以有兩次機會進行生物校驗,如果都失敗則Touch ID(Face ID)被鎖住,以后每次進來驗證都是調(diào)用系統(tǒng)的設備密碼直至輸入正確的設備密碼才能重新使用生物校驗

驗證類型

  • LABiometryTypeNone / LABiometryNone

不支持生物識別

  • LABiometryTypeTouchID

支持 Touch ID

  • LABiometryTypeFaceID

支持 Face ID

驗證錯誤類型

  • LAErrorAuthenticationFailed

授權(quán)失敗

  • LAErrorUserCancel

用戶取消驗證Touch ID

  • LAErrorUserFallback

用戶選擇輸入密碼,切換主線程處理

  • LAErrorSystemCancel

系統(tǒng)取消授權(quán),如其他APP切入

  • LAErrorPasscodeNotSet

系統(tǒng)密碼未設置

  • LAErrorTouchIDNotAvailable

設備Touch ID不可用,例如未打開

設備不支持Touch ID/Face ID,iOS 11被標注過時,需要使用LAErrorBiometryNotAvailable代替

  • LAErrorTouchIDNotEnrolled

設備Touch ID不可用,用戶未錄入

沒有錄入指紋/人臉,iOS 11被標注過時,需要使用LAErrorBiometryNotEnrolled代替

  • LAErrorTouchIDLockout

設備Touch ID不可用,如多次驗證失敗

  • LAErrorAppCancel

APP調(diào)用了- (void)invalidate 方法使 LAContext失效

  • LAErrorInvalidContext

實例化的LAContext對象失效,再次調(diào)用evaluation...方法則會彈出此錯誤信息

  • LAErrorBiometryNotAvailable

設備不支持Touch ID/Face ID,iOS 11新增,由于新增Face ID,故用來代替LAErrorTouchIDNotAvailable

  • LAErrorBiometryNotEnrolled

沒有錄入指紋/人臉,iOS 11新增,由于新增Face ID,故用來代替LAErrorTouchIDNotEnrolled

  • LAErrorBiometryLockout

超過重試限制,Touch ID/Face ID被鎖定,需要進行設備密碼解鎖后重新激活

  • LAErrorNotInteractive

應用尚未啟動完成或者已經(jīng)進入非激活狀態(tài)時調(diào)用驗證方法會收到該錯誤,例如:將驗證方法放到didEnterBackground方法中進行可能會導致這個錯誤

選擇驗證方式


- (void)opinionBiologicalRecognition {
    
    // 系統(tǒng)支持,最低支持iOS 8.0
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
        
        // 初始化 LAContext 上下文對象
        LAContext *context = [LAContext new];
        
        // 驗證彈框提供兩個按鈕,CancelButton 點擊取消,F(xiàn)allbackButton 點擊輸入數(shù)字密碼,可自定義標題
        // 首次驗證失敗后才會出現(xiàn) FallbackButton
        context.localizedCancelTitle = @"取消";
        context.localizedFallbackTitle = @"使用密碼";
        
        // 初始化錯誤對象指針
        NSError *error;
        
        // 判斷驗證方式
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
            
            // iOS 11.0 及以上包含指紋及面部識別的機型
            if (@available(iOS 11.0, *)) {
                
                // FaceID
                if (context.biometryType == LABiometryTypeFaceID) {
                    [self showFaceIdVerification:context];
                }
                
                // TouchID
                else if (context.biometryType == LABiometryTypeTouchID) {
                    [self showTouchIdVerification:context];
                }
                
            // iOS 11.0 以下不包含面部識別
            } else {
                
                // TouchID
                [self showTouchIdVerification:context];
            }
        }
    }
}

Face ID

- (void)showFaceIdVerification:(LAContext *)context {
    
    // 調(diào)用面部識別并初始化提示文案
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"面容ID" reply:^(BOOL success, NSError * _Nullable error) {
        
        if (success) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                // 驗證成功,回到主線程做后續(xù)操作
            });
        } else {
            
            // 驗證失敗,后續(xù)處理
            [self dealWithFaceIdOrTouchIdError:error];
        }
    }];
}

Touch ID

- (void)showFaceIdVerification:(LAContext *)context {
    
    // 調(diào)用指紋識別并初始化提示文案
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"請驗證已有的指紋進行支付" reply:^(BOOL success, NSError * _Nullable error) {
        
        if (success) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                // 驗證成功,回到主線程做后續(xù)操作
            });
        } else {
            
            // 驗證失敗,后續(xù)處理
            [self dealWithFaceIdOrTouchIdError:error];
        }
    }];
}

驗證失敗處理


- (void)dealWithFaceIdOrTouchIdError:(NSError *)error {
    
    switch (error.code) {
        case LAErrorSystemCancel: {
            // 系統(tǒng)取消授權(quán),如其他APP切入
            break;
        }
        case LAErrorUserCancel: {
            // 用戶取消驗證Touch ID
            break;
        }
        case LAErrorAuthenticationFailed: {
            // 授權(quán)失敗
            break;
        }
        case LAErrorPasscodeNotSet: {
            // 系統(tǒng)未設置密碼
            break;
        }
        case LAErrorTouchIDNotAvailable: {
            // 設備Touch ID不可用,例如未打開
            break;
        }
        case LAErrorTouchIDNotEnrolled: {
            // 設備Touch ID不可用,用戶未錄入
            break;
        }
        case LAErrorUserFallback: {
            // 用戶選擇輸入密碼,切換主線程處理
            break;
        }
        default: {
            dispatch_async(dispatch_get_main_queue(), ^{
                // 其他情況,切換主線程處理
            });
            break;
        }
    }
}

參考

iOS指紋/密碼鑒定

使用TouchID驗證登錄踩過的一些坑(同時更新FaceID使用方法)

LocalAuthentication開發(fā)實踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容