iOS开发指纹/面容识别
1、info.plist中增加NSFaceIDUsageDescription权限申请说明
<key>NSFaceIDUsageDescription</key>
<string>允许设备访问FaceID</string>
2、github集成YZAuthID
3、引用代码
#import "YZAuthID.h"[self authVerification];
- (void)authVerification {YZAuthID *authID = [[YZAuthID alloc] init];[authID yz_showAuthIDWithDescribe:nil block:^(YZAuthIDState state, NSError *error) {if (state == YZAuthIDStateNotSupport) { // 不支持TouchID/FaceIDNSLog(@"对不起,当前设备不支持指纹/面容ID");} else if(state == YZAuthIDStateFail) { // 认证失败NSLog(@"指纹/面容ID不正确,认证失败");} else if(state == YZAuthIDStateTouchIDLockout) { // 多次错误,已被锁定NSLog(@"多次错误,指纹/面容ID已被锁定,请到手机解锁界面输入密码");} else if (state == YZAuthIDStateSuccess) { // TouchID/FaceID验证成功NSLog(@"认证成功!");}}];
}
4、效果展示
5、源码展示
YZAuthID.h
#import <LocalAuthentication/LocalAuthentication.h>/*** TouchID/FaceID 状态*/
typedef NS_ENUM(NSUInteger, YZAuthIDState){/*** 当前设备不支持TouchID/FaceID*/YZAuthIDStateNotSupport = 0,/*** TouchID/FaceID 验证成功*/YZAuthIDStateSuccess = 1,/*** TouchID/FaceID 验证失败*/YZAuthIDStateFail = 2,/*** TouchID/FaceID 被用户手动取消*/YZAuthIDStateUserCancel = 3,/*** 用户不使用TouchID/FaceID,选择手动输入密码*/YZAuthIDStateInputPassword = 4,/*** TouchID/FaceID 被系统取消 (如遇到来电,锁屏,按了Home键等)*/YZAuthIDStateSystemCancel = 5,/*** TouchID/FaceID 无法启动,因为用户没有设置密码*/YZAuthIDStatePasswordNotSet = 6,/*** TouchID/FaceID 无法启动,因为用户没有设置TouchID/FaceID*/YZAuthIDStateTouchIDNotSet = 7,/*** TouchID/FaceID 无效*/YZAuthIDStateTouchIDNotAvailable = 8,/*** TouchID/FaceID 被锁定(连续多次验证TouchID/FaceID失败,系统需要用户手动输入密码)*/YZAuthIDStateTouchIDLockout = 9,/*** 当前软件被挂起并取消了授权 (如App进入了后台等)*/YZAuthIDStateAppCancel = 10,/*** 当前软件被挂起并取消了授权 (LAContext对象无效)*/YZAuthIDStateInvalidContext = 11,/*** 系统版本不支持TouchID/FaceID (必须高于iOS 8.0才能使用)*/YZAuthIDStateVersionNotSupport = 12
};@interface YZAuthID : LAContexttypedef void (^YZAuthIDStateBlock)(YZAuthIDState state, NSError *error);/*** 启动TouchID/FaceID进行验证* @param describe TouchID/FaceID显示的描述* @param block 回调状态的block*/
- (void)yz_showAuthIDWithDescribe:(NSString *)describe block:(YZAuthIDStateBlock)block;@end
YZAuthID.m
#import "YZAuthID.h"
#import <UIKit/UIKit.h>#define iPhoneX (UIScreen.mainScreen.bounds.size.width >= 375.f && UIScreen.mainScreen.bounds.size.height >= 812.f)@implementation YZAuthID+ (instancetype)sharedInstance {static YZAuthID *instance = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{instance = [[YZAuthID alloc] init];});return instance;
}- (void)yz_showAuthIDWithDescribe:(NSString *)describe block:(YZAuthIDStateBlock)block {if(!describe) {if(iPhoneX){describe = @"验证已有面容";}else{describe = @"通过Home键验证已有指纹";}}if (NSFoundationVersionNumber < NSFoundationVersionNumber_iOS_8_0) {dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"系统版本不支持TouchID/FaceID (必须高于iOS 8.0才能使用)");block(YZAuthIDStateVersionNotSupport, nil);});return;}LAContext *context = [[LAContext alloc] init];// 认证失败提示信息,为 @"" 则不提示context.localizedFallbackTitle = @"输入密码";NSError *error = nil;// LAPolicyDeviceOwnerAuthenticationWithBiometrics: 用TouchID/FaceID验证// LAPolicyDeviceOwnerAuthentication: 用TouchID/FaceID或密码验证, 默认是错误两次或锁定后, 弹出输入密码界面(本案例使用)if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:describe reply:^(BOOL success, NSError * _Nullable error) {if (success) {dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 验证成功");block(YZAuthIDStateSuccess, error);});}else if(error){if (@available(iOS 11.0, *)) {switch (error.code) {case LAErrorAuthenticationFailed:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 验证失败");block(YZAuthIDStateFail, error);});break;}case LAErrorUserCancel:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 被用户手动取消");block(YZAuthIDStateUserCancel, error);});}break;case LAErrorUserFallback:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"用户不使用TouchID/FaceID,选择手动输入密码");block(YZAuthIDStateInputPassword, error);});}break;case LAErrorSystemCancel:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 被系统取消 (如遇到来电,锁屏,按了Home键等)");block(YZAuthIDStateSystemCancel, error);});}break;case LAErrorPasscodeNotSet:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 无法启动,因为用户没有设置密码");block(YZAuthIDStatePasswordNotSet, error);});}break;//case LAErrorTouchIDNotEnrolled:{case LAErrorBiometryNotEnrolled:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 无法启动,因为用户没有设置TouchID/FaceID");block(YZAuthIDStateTouchIDNotSet, error);});}break;//case LAErrorTouchIDNotAvailable:{case LAErrorBiometryNotAvailable:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 无效");block(YZAuthIDStateTouchIDNotAvailable, error);});}break;//case LAErrorTouchIDLockout:{case LAErrorBiometryLockout:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID/FaceID 被锁定(连续多次验证TouchID/FaceID失败,系统需要用户手动输入密码)");block(YZAuthIDStateTouchIDLockout, error);});}break;case LAErrorAppCancel:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)");block(YZAuthIDStateAppCancel, error);});}break;case LAErrorInvalidContext:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"当前软件被挂起并取消了授权 (LAContext对象无效)");block(YZAuthIDStateInvalidContext, error);});}break;default:break;}} else {// iOS 11.0以下的版本只有 TouchID 认证switch (error.code) {case LAErrorAuthenticationFailed:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 验证失败");block(YZAuthIDStateFail, error);});break;}case LAErrorUserCancel:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 被用户手动取消");block(YZAuthIDStateUserCancel, error);});}break;case LAErrorUserFallback:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"用户不使用TouchID,选择手动输入密码");block(YZAuthIDStateInputPassword, error);});}break;case LAErrorSystemCancel:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)");block(YZAuthIDStateSystemCancel, error);});}break;case LAErrorPasscodeNotSet:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 无法启动,因为用户没有设置密码");block(YZAuthIDStatePasswordNotSet, error);});}break;case LAErrorTouchIDNotEnrolled:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 无法启动,因为用户没有设置TouchID");block(YZAuthIDStateTouchIDNotSet, error);});}break;//case :{case LAErrorTouchIDNotAvailable:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 无效");block(YZAuthIDStateTouchIDNotAvailable, error);});}break;case LAErrorTouchIDLockout:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码)");block(YZAuthIDStateTouchIDLockout, error);});}break;case LAErrorAppCancel:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"当前软件被挂起并取消了授权 (如App进入了后台等)");block(YZAuthIDStateAppCancel, error);});}break;case LAErrorInvalidContext:{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"当前软件被挂起并取消了授权 (LAContext对象无效)");block(YZAuthIDStateInvalidContext, error);});}break;default:break;}}}}];}else{dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"当前设备不支持TouchID/FaceID");block(YZAuthIDStateNotSupport, error);});}
}@end
iOS开发指纹/面容识别相关推荐
- iOS开发-面部距离识别 Vision 护眼模式 儿童防近视功能
iOS开发-面部距离识别 Vision 护眼模式 儿童防近视功能 前言-基于Vision和CIDetector 举例 大概思路 API 使用 Demo 前言-基于Vision和CIDetector i ...
- IOS指纹/面容识别,TouchID/FaceID验证
转自:https://www.jianshu.com/p/da752036b2f4 你还在为开发TouchID/FaceID识别功能而去翻阅大量的文档吗? 使用YZAuthID仅需一个回调方法即可轻松 ...
- 【iOS】指纹(面容)支付基本逻辑和适配
在这边提供一些指纹和面容支付的基本思路,差异以及所遇到的坑. 一.支付逻辑基本思路 我们重点是考虑如何保证支付的安全,首先肯定不能本地存入用户的支付密码,这样在人行(中国人民银行)来检查的时候是行不通 ...
- iOS开发实现TouchID指纹解锁
iOS开发实现TouchID指纹解锁 一直想实现一下指纹解锁,苦于一直没时间,最近终于闲了下来所以翻了翻文档看了看demo,完成了这篇教程.本功能实现起来是很简单的,因为苹果都已经帮我们封装好了,只需 ...
- ios开发ocr识别_车牌识别技术
核心技术:移动车牌识别技术,ios车牌识别,车牌识别技术移动端,移动端车牌识别技术,手机端车牌识别,OCR车牌识别,手机端车牌识别 移动端车牌识别OCR技术描述 移动端车牌识别OCR技术是我公司开发的 ...
- 中控指纹采集器开发指纹识别项目(说明)
历史指纹识别相关开发版本: 指纹识别开发1.0,开发时间:2018-01-04 指纹识别开发2.0,开发时间:2018-01-04 指纹识别开发3.0,开发时间:2020-01-06 可以从时间上看的 ...
- iOS开发中如何理解“iPhone X不支持指纹”
最近发现不少人不理解需求中说的"这个功能需要支持指纹的验证方式". 很多人理解为"iPhone X不支持指纹",所以在iPhone X把"生物识别&q ...
- 【iOS开发】相册选择图片识别条形码
[iOS开发]相册选择图片识别条形码 原生识别条形码 VNDetectBarcodesRequest 只要iOS11.0+以上支持,支持iOS11.0-以下请使用其他方案 // Create a ba ...
- iOS 开发技术之人脸识别
Demo源码:https://github.com/EmyWong/PersonalUITech 前言 作为一名iOS开发人员,我觉得第一步是能够基本模仿一个APP,完成别人APP的界面搭建:第二步, ...
最新文章
- Linux 下的动态库、静态库与环境变量
- R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facet、facet_grid)
- php gridview,PHP编程:yii2-GridView在开发中常用的功能及技巧总结
- extern C用法详解
- python编程入门经典-总算理解python编程入门经典教程
- java基本数据类型存放在哪?
- 第六章 C语言数组_什么是数组?C语言数组的基本概念
- mysql删除盘点表_千方百剂系统常见问题及解决方法 0871-64648361
- 双系统(win10+ubuntu)引导页消失
- 关于JSON存放List集合的顺序问题
- 微信小程序-音视频剪辑
- npoi 将html导出word,使用NPOI将数据导出为word格式里的table
- 关于树莓派(四):安装树莓派时遇见的错误
- hp打印机无法与计算机,HP打印机无法连接到计算机
- 小米技术委员能扛起雷军技术立业的大旗吗?
- Spring Data JPA-单向一对一关联映射
- redis中键值出现 \xAC\xED\x00\x05t\x00\x11的原因和解决方法
- Linux系统- Redhat7.6配置网卡team和网桥详解
- 车速与档位匹配关系_车速与档位不匹配后果,车速与档位的合理匹配关系介绍...
- [凯立德]2013.12.17凯立德发布秋季版(2F21J0E)最新增量包SP1_我是亲民_新浪博客...
热门文章
- python语言规定标识符_Python语法规则
- 正则表达式 年月日时分秒校验
- 科沃斯扫地机器人哪个型号最实用_扫地机器人哪个型号好_智能扫地机功能-科沃斯机器人官网-科沃斯机器人官网...
- 计算机学院大学毕业晚会标题,“告白青春,感谢有你” 计算机学院2018届毕业晚会圆满举行...
- 解开最后期限的镣铐(转载)
- python提取两列数据对比_使用Python的Dataframe取两列时间值相差一年的所有行方法...
- 巴氏距离 Bhattacharyya
- easyUI-增删改查
- Linux RedHat CentOS 操作系统加载挂载U盘、USB移动硬盘方法
- vue 绑定动态class变量