iOS 8 SDK Touch ID指纹识别功能

前言

      iOS 8 SDK向开发者公布了Touch ID指纹识别功能,允许App对用户身份进行本地验证。

Touch ID支持系统和机型

      iOS系统的Touch ID指纹识别功能最低支持的机型为iPhone 5s最低支持系统为iOS 8.

依赖框架

LocalAuthentication.framework

该框架下只有两个头文件:
LAContext.h
LAError.h

LAContext

简介

通过该对象可完成指纹识别。

typedef NS_ENUM(NSInteger, LAPolicy)
{
    //  指纹验证
    LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,

    //  使用Touch ID或者密码验证,默认是错误两次指纹或者锁定后,弹出输入密码界面
    LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_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(10_11, 9_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAErrorTouchIDLockout,
    // 与LAErrorSystemCancel相似,都是当前软件被挂起取消了授权,LAErrorAppCancel该错误是用户自己切到了别的应用,例如按Home键挂起。
    LAErrorAppCancel        NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
    // 授权过程中,LAContext对象被释放掉了,造成的授权失败
    LAErrorInvalidContext   NS_ENUM_AVAILABLE(10_11, 9_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地址

你可能感兴趣的:(iOS记录)