正文
}
break;
case LAErrorBiometryNotAvailable:
{
NSLog(@"设备未设置Touch ID"); // -6
}
break;
case LAErrorBiometryNotEnrolled: // Authentication could not start, because Touch ID has no enrolled fingers
{
NSLog(@"用户未录入指纹"); // -7
}
break;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
case LAErrorBiometryLockout: //Authentication was not successful, because there were too many failed Touch ID attempts and Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite 用户连续多次进行Touch ID验证失败,Touch ID被锁,需要用户输入密码解锁,先Touch ID验证密码
{
NSLog(@"Touch ID被锁,需要用户输入密码解锁"); // -8 连续五次指纹识别错误,TouchID功能被锁定,下一次需要输入系统密码
}
break;
case LAErrorAppCancel:
{
NSLog(@"用户不能控制情况下APP被挂起"); // -9
}
break;
case LAErrorInvalidContext:
{
NSLog(@"LAContext传递给这个调用之前已经失效"); // -10
}
break;
#else
#endif
default:
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"其他情况,切换主线程处理");
}];
break;
}
}
}
}];
}else {
//不支持
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"温馨提示" message:@"该设备不支持TouchID" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
});
}
注:代码中的NSNotificationCenter用于不同操作后的界面跳转,重新设置window.rootViewController,可忽略。
到这里指纹解锁就结束了,很简单的一个API调用。
手势解锁
其实在之前还没有接触和刚开始接触iOS开发的时候,觉得手势解锁很难,完全不知道怎么去实现?但是当我在自学CAAnimation的时候,脑海中突然就想到了一个实现手势解锁的方案,下面就开始介绍我的实现方法:
构思
-
手势解锁是怎么去验证你滑动的手势是正确的?
其实手势解锁和输入密码的验证是一样的,在你画UI的时候,你可以给每一个*圆点*一个id,在你设置手势的时候,将滑动到对应*圆点*的id放入一个有序集合中,并保存起来,然后验证登录的时候,用另外一个有序集合记录你当前滑动到的*圆点*id,然后和之前保存在本地的进行对比,就可以达到验证的目的了
-
用什么方式去具体实现UI?
在之前想过几种实现方式,但是都被pass掉了,直到自学CAAnimation的时候,才突然意识到有一个很好的实现方式----CAShapeLayer
其实,当你有了这两个问题的答案的时候,你的手势解锁就已经实现了一大部分,后面的部分就是敲代码了。
实现 (工程代码见文末链接)
先上几张效果图:(由于本人艺术细胞有限,所以为了好看点,界面的UI是参照QQ安全中心的手势解锁)
目录结构
-
GesturesViewController:这个controller用于展示UI,你可以替换成自己controller,
-
GesturesView:用于圆点按钮的初始化和布局,
-
PointView:圆点手势按钮。
这里主要介绍一下GesturesView和PointView,主要逻辑也都在这两个类中:
PointView
(主要是界面UI,不多介绍,直接上代码)
PointView.h
- (instancetype)initWithFrame:(CGRect)frame
withID:(NSString *)ID;
@property (nonatomic, copy, readonly) NSString *ID;
//选中
@property (nonatomic, assign) BOOL isSelected;
//解锁失败
@property (nonatomic, assign) BOOL isError;
//解锁成功
@property (nonatomic, assign) BOOL isSuccess;
-
-initWithFrame:withID:传入frameheID,用于初始化PointView,
-
ID:只读,用于外部获取ID,
-
isSelected,isError,isSuccess:用于判断PointView的状态以显示不通的UI。
PointView.m
通过懒加载初始化三个CAShapeLayer
#pragma mark - 懒加载
//外层手势按钮
- (CAShapeLayer *)contentLayer
{