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开发指纹/面容识别相关推荐

  1. iOS开发-面部距离识别 Vision 护眼模式 儿童防近视功能

    iOS开发-面部距离识别 Vision 护眼模式 儿童防近视功能 前言-基于Vision和CIDetector 举例 大概思路 API 使用 Demo 前言-基于Vision和CIDetector i ...

  2. IOS指纹/面容识别,TouchID/FaceID验证

    转自:https://www.jianshu.com/p/da752036b2f4 你还在为开发TouchID/FaceID识别功能而去翻阅大量的文档吗? 使用YZAuthID仅需一个回调方法即可轻松 ...

  3. 【iOS】指纹(面容)支付基本逻辑和适配

    在这边提供一些指纹和面容支付的基本思路,差异以及所遇到的坑. 一.支付逻辑基本思路 我们重点是考虑如何保证支付的安全,首先肯定不能本地存入用户的支付密码,这样在人行(中国人民银行)来检查的时候是行不通 ...

  4. iOS开发实现TouchID指纹解锁

    iOS开发实现TouchID指纹解锁 一直想实现一下指纹解锁,苦于一直没时间,最近终于闲了下来所以翻了翻文档看了看demo,完成了这篇教程.本功能实现起来是很简单的,因为苹果都已经帮我们封装好了,只需 ...

  5. ios开发ocr识别_车牌识别技术

    核心技术:移动车牌识别技术,ios车牌识别,车牌识别技术移动端,移动端车牌识别技术,手机端车牌识别,OCR车牌识别,手机端车牌识别 移动端车牌识别OCR技术描述 移动端车牌识别OCR技术是我公司开发的 ...

  6. 中控指纹采集器开发指纹识别项目(说明)

    历史指纹识别相关开发版本: 指纹识别开发1.0,开发时间:2018-01-04 指纹识别开发2.0,开发时间:2018-01-04 指纹识别开发3.0,开发时间:2020-01-06 可以从时间上看的 ...

  7. iOS开发中如何理解“iPhone X不支持指纹”

    最近发现不少人不理解需求中说的"这个功能需要支持指纹的验证方式". 很多人理解为"iPhone X不支持指纹",所以在iPhone X把"生物识别&q ...

  8. 【iOS开发】相册选择图片识别条形码

    [iOS开发]相册选择图片识别条形码 原生识别条形码 VNDetectBarcodesRequest 只要iOS11.0+以上支持,支持iOS11.0-以下请使用其他方案 // Create a ba ...

  9. iOS 开发技术之人脸识别

    Demo源码:https://github.com/EmyWong/PersonalUITech 前言 作为一名iOS开发人员,我觉得第一步是能够基本模仿一个APP,完成别人APP的界面搭建:第二步, ...

最新文章

  1. Linux 下的动态库、静态库与环境变量
  2. R语言ggplot2可视化绘制带有双y轴(double y axis)的分面图(facet、facet_grid)
  3. php gridview,PHP编程:yii2-GridView在开发中常用的功能及技巧总结
  4. extern C用法详解
  5. python编程入门经典-总算理解python编程入门经典教程
  6. java基本数据类型存放在哪?
  7. 第六章 C语言数组_什么是数组?C语言数组的基本概念
  8. mysql删除盘点表_千方百剂系统常见问题及解决方法      0871-64648361
  9. 双系统(win10+ubuntu)引导页消失
  10. 关于JSON存放List集合的顺序问题
  11. 微信小程序-音视频剪辑
  12. npoi 将html导出word,使用NPOI将数据导出为word格式里的table
  13. 关于树莓派(四):安装树莓派时遇见的错误
  14. hp打印机无法与计算机,HP打印机无法连接到计算机
  15. 小米技术委员能扛起雷军技术立业的大旗吗?
  16. Spring Data JPA-单向一对一关联映射
  17. redis中键值出现 \xAC\xED\x00\x05t\x00\x11的原因和解决方法
  18. Linux系统- Redhat7.6配置网卡team和网桥详解
  19. 车速与档位匹配关系_车速与档位不匹配后果,车速与档位的合理匹配关系介绍...
  20. [凯立德]2013.12.17凯立德发布秋季版(2F21J0E)最新增量包SP1_我是亲民_新浪博客...

热门文章

  1. python语言规定标识符_Python语法规则
  2. 正则表达式 年月日时分秒校验
  3. 科沃斯扫地机器人哪个型号最实用_扫地机器人哪个型号好_智能扫地机功能-科沃斯机器人官网-科沃斯机器人官网...
  4. 计算机学院大学毕业晚会标题,“告白青春,感谢有你” 计算机学院2018届毕业晚会圆满举行...
  5. 解开最后期限的镣铐(转载)
  6. python提取两列数据对比_使用Python的Dataframe取两列时间值相差一年的所有行方法...
  7. 巴氏距离 Bhattacharyya
  8. easyUI-增删改查
  9. Linux RedHat CentOS 操作系统加载挂载U盘、USB移动硬盘方法
  10. vue 绑定动态class变量