介绍
Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术。iOS8后苹果开放了Touch ID的API给开发者。
Face ID 是iPhone X 专属功能,也是iOS 11中的新功能,用于取代Touch ID,他们的作用都是为了让我们不在需要每次都使用密码进行身份验证,只需要指纹或者人脸就可完成相关认证。
Touch ID 和 Face ID 都属于生物特征认证,下文所提到的认证都包括这两种认证。
使用
使用Touch ID 和 Face ID 我们需要导入LocalAuthentication.framework框架,该框架只包含LAContext一个类,完成认证的所需接口就包含在这个类里面,下面就是这个类的主要方法和属性。
判断认证是否可用
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
该方法会返回认证方式是否可用,policy表示认证策略,该枚举有两个可选值,
1、LAPolicyDeviceOwnerAuthenticationWithBiometrics 使用生物识别认证设备持有者身份
2、LAPolicyDeviceOwnerAuthentication 使用生物识别或者密码去认证设备持有者身份
两者的区别是 LAPolicyDeviceOwnerAuthentication 是iOS 9才开始有效的,在用户认证失败后会弹出密码输入框。点击fallback按钮将跳到密码输入界面,而不是执行回调block。
开始认证
- (void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void(^)(BOOL success, NSError * __nullable error))reply;
localizedReason 认证原因,会在弹出框上显示,reply认证结果回调block,error的错误原因有一下几个:
typedef NS_ENUM(NSInteger, LAError) {
//用户验证没有通过,比如提供了错误的指纹或人面
LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
// 用户取消了认证
LAErrorUserCancel = kLAErrorUserCancel,
//用户不想认证,想进行其他操作,比如输入密码等
LAErrorUserFallback = kLAErrorUserFallback,
// 系统终止了验证,比如app进入后台
LAErrorSystemCancel = kLAErrorSystemCancel,
// 用户没有设定密码
LAErrorPasscodeNotSet = kLAErrorPasscodeNotSet,
// 设备不支持Touch ID,为了适配Face ID iOS 11之后废除
LAErrorTouchIDNotAvailable = kLAErrorTouchIDNotAvailable NS_ENUM_DEPRECATED(10_10,10_13,8_0,11_0,"use LAErrorBiometryNotAvailable") = kLAErrorTouchIDNotAvailable,
// 设备没有进行Touch ID 指纹注册,为了适配Face ID iOS 11之后废除
LAErrorTouchIDNotEnrolled = kLAErrorTouchIDNotEnrolled NS_ENUM_DEPRECATED(10_10,10_13,8_0,11_0,"use LAErrorBiometryNotEnrolled"),
//由于失败太多次,并且认证被锁定,要求用户输入密码来解锁。使用LAPolicyDeviceOwnerAuthenticationWithBiometrics策略多次失败后,不会自动弹出密码输入界面,并且调用验证方法会直接返回错误,我们需要转换验证策略为LAPolicyDeviceOwnerAuthentication,再调用认证方法,这时系统会弹出密码输入框让我们解锁,为了适配Face ID iOS 11之后废除
LAErrorTouchIDLockout = kLAErrorTouchIDLockout NS_ENUM_DEPRECATED(10_11,10_13,9_0,11_0,"use LAErrorBiometryLockout"),
//被app取消,比如,在认证过程中调用了invalidate方法
LAErrorAppCancel = kLAErrorAppCancel NS_ENUM_AVAILABLE(10_11,9_0),
//LAContext对象已经失效了,比如,在认证前调用了invalidate方法
LAErrorInvalidContext = kLAErrorInvalidContext NS_ENUM_AVAILABLE(10_11,9_0),
//生物识别不可用,iOS 11之后可用
LAErrorBiometryNotAvailable = kLAErrorBiometryNotAvailable NS_ENUM_AVAILABLE(10_13,11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0),
//未设置人脸或指纹,iOS 11之后可用
LAErrorBiometryNotEnrolled = kLAErrorBiometryNotEnrolled NS_ENUM_AVAILABLE(10_13,11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0),
//由于失败太多次,并且认证被锁定,要求用户输入密码来解锁。使用LAPolicyDeviceOwnerAuthenticationWithBiometrics策略多次失败后,不会自动弹出密码输入界面,并且调用验证方法会直接返回错误,我们需要转换验证策略为LAPolicyDeviceOwnerAuthentication,再调用认证方法,这时系统会弹出密码输入框让我们解锁
LAErrorBiometryLockout = kLAErrorBiometryLockout NS_ENUM_AVAILABLE(10_13,11_0) __WATCHOS_AVAILABLE(4.0) __TVOS_AVAILABLE(11.0),
//被禁止弹出识别UI,无法验证,比如:LAContext的interactionNotAllowed属性被设为YES
LAErrorNotInteractive = kLAErrorNotInteractive API_AVAILABLE(macos(10.10), ios(8.0), watchos(3.0), tvos(10.0))
} NS_ENUM_AVAILABLE(10_10, 8_0);
使当前认证上下文对象无效
- (void)invalidate;
touchIDAuthenticationAllowableReuseDuration 该属性可以设置一个时间间隔,在时间间隔内是调用认证方法时可以不需要认证,直接通过。默认是0秒,最长可以设置5分钟。
localizedFallbackTitle 回退按钮标题,允许用户其他操作,设为空字符将被隐藏
localizedCancelTitle 取消按钮标题
maxBiometryFailures 最大认证失败次数
evalueatedPolicyDomainState 这个属性可以检测你的指纹数据库的变化,增加或者删除指纹这个属性会做出相应的反应,只有验证成功之后才会别赋值,注意:这个值得变化只能说明指纹库发生了变化,并不能知道发生了什么变化。
localizedReason 认证原因,会在弹出框上显示
interactionNotAllowed 设为Yes将不会弹出验证UI,直接回调错误
biometryType 认证类型,该属性只有在canEvaluatePolicy方法返回成功后,才会被赋值,该属性是有三个可选值:
LABiometryNone无生物验证方式
LABiometryTypeTouchID touchid认证
LABiometryTypeFaceID Face ID认证,该属性是iOS 11新添加