天天看點

iOS 8 SDK Touch ID指紋識别功能

前言

      iOS 8 SDK向開發者公布了Touch ID指紋識别功能,允許App對使用者身份進行本地驗證。

Touch ID支援系統和機型

      iOS系統的Touch ID指紋識别功能最低支援的機型為iPhone 5s,最低支援系統為iOS 8.

依賴架構

該架構下隻有兩個頭檔案:

LAContext.h

LAError.h

LAContext

簡介

通過該對象可完成指紋識别。

typedef NS_ENUM(NSInteger, LAPolicy)
{
    //  指紋驗證
    LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, _0) __WATCHOS_AVAILABLE() __TVOS_AVAILABLE() = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,

    //  使用Touch ID或者密碼驗證,預設是錯誤兩次指紋或者鎖定後,彈出輸入密碼界面
    LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(_11, _0) = kLAPolicyDeviceOwnerAuthentication
};
           
常用屬性
// 回退按鈕标題
// 預設标題為“輸入密碼”,當設定成空字元串的時候,該按鈕被隐藏
@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;

// 取消按鈕标題
// 設定驗證TouchID時彈出Alert的取消按鈕的标題
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle;

// 允許驗證失敗最大次數
@property (nonatomic, nullable) NSNumber *maxBiometryFailures;

@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState;

// 指定TouchID驗證的間隔,間隔期之内可以免驗證讀取Keychain資料
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration;
           
核心函數
//  判斷裝置是否支援Touch ID
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
//  驗證身份的函數
- (void)evaluatePolicy:(LAPolicy)policy
       localizedReason:(NSString *)localizedReason
                 reply:(void(^)(BOOL success, NSError * __nullable error))reply;
           

LAError

簡介

主要用于Touch ID驗證身份失敗後的一些錯誤處理。

核心函數
typedef NS_ENUM(NSInteger, LAError)
{
    //  授權失敗
    LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
    // 使用者取消Touch ID授權
    LAErrorUserCancel = kLAErrorUserCancel,
    // 使用者選擇輸入密碼
    LAErrorUserFallback = kLAErrorUserFallback,
    // 系統取消授權(例如其他APP切入)
    LAErrorSystemCancel = kLAErrorSystemCancel,
    // 系統未設定密碼
    LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
    // 裝置Touch ID不可用,例如未打開
    LAErrorTouchIDNotAvailable  = kLAErrorTouchIDNotAvailable,
    // 裝置Touch ID不可用,使用者未錄入
    LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled,
    // 使用者多次連續使用Touch ID失敗,Touch ID被鎖,需要使用者輸入密碼解鎖,這個錯誤的互動LocalAuthentication.framework已封裝過,不需要開發者處理
    LAErrorTouchIDLockout   NS_ENUM_AVAILABLE(_11, _0) __WATCHOS_AVAILABLE() __TVOS_AVAILABLE() = kLAErrorTouchIDLockout,
    // 與LAErrorSystemCancel相似,都是目前軟體被挂起取消了授權,LAErrorAppCancel該錯誤是使用者自己切到了别的應用,例如按Home鍵挂起。
    LAErrorAppCancel        NS_ENUM_AVAILABLE(_11, _0) = kLAErrorAppCancel,
    // 授權過程中,LAContext對象被釋放掉了,造成的授權失敗
    LAErrorInvalidContext   NS_ENUM_AVAILABLE(_11, _0) = kLAErrorInvalidContext
} 
           

代碼

核心代碼

//建立LAContext執行個體
    LAContext  *authenticationContext= [[LAContext alloc]init];
    authenticationContext.localizedFallbackTitle = @"點,驗證其他";
    NSError *error;
    //1:檢查Touch ID 是否可用
    if ([authenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        NSLog(@"touchId 可用");
        //2:執行認證政策
        [authenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"需要驗證您的指紋來确認您的身份資訊" reply:^(BOOL success, NSError * _Nullable error) {
            if (success) {
                NSLog(@"通過了Touch Id指紋驗證");
            }else{
                NSLog(@"error===%@",error);
                switch (error.code) {
                    case LAErrorAuthenticationFailed:{//授權失敗
                        NSLog(@"Authentication Failed");
                        break;
                    }
                    case LAErrorUserCancel:{// 使用者取消Touch ID授權
                        NSLog(@"Authentication was cancelled by the user");
                        break;
                    }
                    case LAErrorUserFallback:{//使用者選擇輸入密碼
                        NSLog(@"User selected to enter custom password");
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            // TODO SOMETHING
                        }];
                        break;
                    }
                    case LAErrorSystemCancel:{//系統取消授權(例如其他APP切入)
                        NSLog(@"Authentication was cancelled by the system");
                        //切換到其他APP,系統取消驗證Touch ID
                        break;
                    }
                    case LAErrorAppCancel:{//與LAErrorSystemCancel相似,都是目前軟體被挂起取消了授權,LAErrorAppCancel該錯誤是使用者自己切到了别的應用,例如按Home鍵挂起。
                        NSLog(@"app cancle the authentication");
                        break;
                    }
                    case LAErrorInvalidContext:{//授權過程中,LAContext對象被釋放掉了,造成的授權失敗
                        NSLog(@"context is invalidated");
                        break;
                    }
                    default:{
                        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                            //其他情況,切換主線程處理
                        }];
                        break;
                    }
                }
            }
        }];
    }else{
        //todo goto 輸入密碼頁面
        NSLog(@"error====%@",error);
        NSLog(@"抱歉,touchId 不可用");
    }
           

Demo位址

Demo位址