Local Authentication
1. 概述
- Local Authentication 框架提供了按照指定的安全策略请求用户授权(本地授权)的工具。例如, 通过 Touch ID 请求用户授权。
2. LAContext
- LAContext 提供了用户授权的上下文。在该上下文中,你可以获取用户授权的相关信息。通常会基于用户的授权状态来进行相应的操作。
3. 授权策略
-
LAPolicyDeviceOwnerAuthenticationWithBiometrics
- 可以简单的理解为,基于 TouchID 的授权;若 Touch ID 不可用,将会授权失败。在后面我们会详细阐述这种授权方式。
- Touch ID,将在错误输入 5 次后被锁定。锁定后,需要输入密码来解锁
-
LAPolicyDeviceOwnerAuthentication
- 支持两种授权方式,即:Touch ID 和 输入密码。
- 优先以 Touch ID 方式进行授权,若 Touch ID 和 输入密码都不用,将授权失败。
- 输入密码授权,将在错误输入 6 次后被锁定。
4. 请求用户授权
- 逻辑
- 逻辑图
- 步骤
- 创建授权上下文
- 初始化授权相关信息
- 判断是否支持指定的授权策略
-(BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * _Nullable *)error
*`注意:若授权上下文为空(即:context = nil), 此时进行判断,会失败,且 error.code 为 0(初始值)`*
-
若支持,则执行下一步;否则,授权失败,根据授权失败信息执行相关操作,错误类型如下
- 该设备不支持 Touch ID
- 未设置密码
- 未注册 Touch ID
-
按照指定的策略请求用户授权
-(void)evaluatePolicy:(LAPolicy)policy localizedReason:(NSString *)localizedReason reply:(void (^)(BOOL success, NSError *error))reply
注意:请不要再 Block reply 中在此判断是否支持指定的策略,及调用 - canEvaluatePolicy:error:;否则会死循环。
- 根据用户授权状态进行下一步操作
- 用户取消了授权
- 用户点击了“输入密码”按钮
- 您已授权失败3次
- 指纹被锁定
- 应用程序进入后台
5. LAPolicy
- LAPolicyDeviceOwnerAuthenticationWithBiometrics,Touch ID 验证
- LAPolicyDeviceOwnerAuthentication,密码验证(iOS 9.0)
6. LAError(失败信息)
- 授权策略是否可用
LAErrorPasscodeNotSet,没有设置密码
LAErrorTouchIDNotEnrolled,没有注册 Touch ID
kLAErrorTouchIDNotAvailable,该设备不支持 Touch ID
- 授权失败
LAErrorUserCancel,用户取消授权
LAErrorUserFallback,Touch ID 授权失败的情况下,用户点击“输入密码”按钮
LAErrorAuthenticationFailed,授权失败三次
LAErrorTouchIDLockout(iOS 9.0),Touch ID 被锁定(失败五次)
LAErrorSystemCancel,应用进入后台时,授权失败
- 其他
LAErrorAppCancel(iOS 9.0)
LAErrorInvalidContext(iOS 9.0)
6. Touch ID Authentication
代码:
// 1.创建授权上下文
LAContext *context = [[LAContext alloc] init];
// 2.初始化授权相关的信息
NSError *authError = nil;
NSString *localizedReasoningString = @"使用指纹解锁";
bool isAvailable = false;
isAvailable = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError];
// 3.判断是否支持指定的授权策略
if (isAvailable) {
// 5.按照指定策略请求用户授权
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:localizedReasoningString reply:^(BOOL success, NSError * _Nullable error) {
if (success) {
NSLog(@"success");
} else {
// 6.根据用户授权状态进行下一步操作
switch (error.code) {
case LAErrorUserCancel:
NSLog(@"用户取消了授权 - %@", error.localizedDescription);
break;
case LAErrorUserFallback:
NSLog(@"用户点击了“输入密码”按钮 - %@", error.localizedDescription);
break;
case LAErrorAuthenticationFailed:
NSLog(@"您已授权失败3次 - %@", error.localizedDescription);
break;
case LAErrorTouchIDLockout:
NSLog(@"指纹被锁定 - %@", error.localizedDescription);
break;
case LAErrorSystemCancel:
NSLog(@"应用程序进入后台 - %@", error.localizedDescription);
break;
default:
NSLog(@"++%@--%zd", error.localizedDescription, error.code);
break;
}
}
}];
} else {
// 4.根据授权失败信息执行相关操作
switch (authError.code) {
case LAErrorPasscodeNotSet:
NSLog(@"未设置密码 - %@", authError.localizedDescription);
break;
case LAErrorTouchIDNotEnrolled:
NSLog(@"未注册 Touch ID - %@", authError.localizedDescription);
break;
case kLAErrorTouchIDNotAvailable:
NSLog(@"该设备不支持 Touch ID - %@", authError.localizedDescription);
break;
default:
NSLog(@"--%@--%zd", authError.localizedDescription, authError.code);
break;
}
}
网友评论