越来越多的app都是用指纹解锁(下面都用TouchID表示),现在略微来讲解一下TouchID(文末的demo里TouchID和手势解锁都有,这里只介绍TouchID)

1.系统所使用TouchID的SDK

添加引入LocalAuthentication.framework
framework主要的内容是这个几个类

- LAContext.h
- LAError.h
- LAPublicDefines.h
- LocalAuthentication.h

使用的时候直接

#import <LocalAuthentication/LocalAuthentication.h>

好了,废话少说,下面来讲主要使用的2个类;

LAError.h

错误类型的枚举类,其实是把LAPublicDefines里的kLAError宏放入到了这枚举类中,统一了一下,具体代码注释写的很清晰,在这我加点中文翻译


typedef NS_ENUM(NSInteger, LAError)
{LAErrorAuthenticationFailed,     // 验证信息出错,就是说你指纹不对LAErrorUserCancel               // 用户取消了验证LAErrorUserFallback             // 用户点击了手动输入密码的按钮,所以被取消了LAErrorSystemCancel             // 被系统取消,就是说你现在进入别的应用了,不在刚刚那个页面,所以没法验证LAErrorPasscodeNotSet           // 用户没有设置TouchIDLAErrorTouchIDNotAvailable      // 用户设备不支持TouchIDLAErrorTouchIDNotEnrolled       // 用户没有设置手指指纹LAErrorTouchIDLockout           // 用户错误次数太多,现在被锁住了LAErrorAppCancel                // 在验证中被其他app中断LAErrorInvalidContext           // 请求验证出错
} NS_ENUM_AVAILABLE(10_10, 8_0);

LAContext.h

想要在自己的项目中使用TouchID,就要用到LAContext.h这个类,
最上面的一个枚举

typedef NS_ENUM(NSInteger, LAPolicy)
{LAPolicyDeviceOwnerAuthenticationWithBiometrics NS_ENUM_AVAILABLE(NA, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0) = kLAPolicyDeviceOwnerAuthenticationWithBiometrics,LAPolicyDeviceOwnerAuthentication NS_ENUM_AVAILABLE(10_11, 9_0) = kLAPolicyDeviceOwnerAuthentication} NS_ENUM_AVAILABLE(10_10, 8_0) __WATCHOS_AVAILABLE(3.0) __TVOS_AVAILABLE(10.0);
第一个枚举LAPolicyDeviceOwnerAuthenticationWithBiometrics就是说,用的是手指指纹去验证的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用
第二个枚举LAPolicyDeviceOwnerAuthentication少了WithBiometrics则是使用TouchID或者密码验证,默认是错误两次指纹或者锁定后,弹出输入密码界面;NS_ENUM_AVAILABLE(10_11, 9_0)iOS 9可用

接下来是几个实例方法,首先创建LAContext实例对象,使用简单的[LAContext alloc] init]来创建;

canEvaluatePolicy:error:方法用来检查当前设备是否可用touchID,返回一个BOOL值
evaluatePolicy:localizedReason:reply:调用验证方法,注意这里的三个参数:
第一个参数policy是要使用上面那个LAPolicy的枚举
第二个参数localizedReason是NSString类型的验证理由
第三个参数reply则是一个回调Block,block内有一个BOOL类型的success判断是否成功验证,还有一个用于判断错误信息的NSError类型的error
invalidate方法用来废止这个context

参数localizedReason的具体讲解:例如使用的TouchID"XXX"的TouchID 请验证已有指纹,其中的XXX是你app的name,这黑体字部分无法更改,后面的小字部分请验证已有指纹可以通过参数localizedReason自定义;

LAContext还有一个localizedFallbackTitle,是用来自定义弹出的alert底部右侧的feedback按钮的title,默认是输入密码,如果不想显示 feedback 按钮;可以设置 feedBackTitle = @""localizedCancelTitle则是自定义取消按钮的title,不过localizedCancelTitle系统10.0才能使用;

好了下面上代码

LAContext *context = [[LAContext alloc] init];context.localizedFallbackTitle = @"验证登录密码";// LAPolicyDeviceOwnerAuthentication__weak __typeof(self)weakSelf = self;[context evaluatePolicy:policy localizedReason:@"通过Home键验证已有手机指纹" reply:^(BOOL success, NSError * _Nullable error) {dispatch_async(dispatch_get_main_queue(), ^{NSString *message = @"";if (success) {message = @"通过了Touch ID 指纹验证";block(YES, NO, message);} else {//失败操作LAError errorCode = error.code;BOOL inputPassword = NO;switch (errorCode) {case LAErrorAuthenticationFailed: {// -1[SVProgressHUD showErrorWithStatus:@"指纹不匹配"];message = @"连续三次指纹识别错误";}break;case LAErrorUserCancel: {// -2message = @"用户取消验证Touch ID";}break;case LAErrorUserFallback: {// -3inputPassword = YES;message = @"用户选择输入密码";}break;case LAErrorSystemCancel: {// -4 TouchID对话框被系统取消,例如按下Home或者电源键message = @"取消授权,如其他应用切入";}break;case LAErrorPasscodeNotSet: {// -5[SVProgressHUD showErrorWithStatus:@"此设备未设置系统密码"];message = @"设备系统未设置密码";}break;case LAErrorTouchIDNotAvailable: {// -6[SVProgressHUD showErrorWithStatus:@"此设备不支持 Touch ID"];message = @"此设备不支持 Touch ID";}break;case LAErrorTouchIDNotEnrolled: {// -7[SVProgressHUD showErrorWithStatus:@"用户未录入指纹"];message = @"用户未录入指纹";}break;case LAErrorTouchIDLockout: {// -8 连续五次指纹识别错误,TouchID功能被锁定,下一次需要输入系统密码if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {[weakSelf openTouchIDWithPolicy:LAPolicyDeviceOwnerAuthentication touchIDBlock:block];}message = @"Touch ID被锁,需要用户输入密码解锁";}break;case LAErrorAppCancel: {// -9 如突然来了电话,电话应用进入前台,APP被挂起啦message = @"用户不能控制情况下APP被挂起";}break;case LAErrorInvalidContext: {// -10message = @"Touch ID 失效";}break;default:// [SVProgressHUD showErrorWithStatus:@"此设备不支持 Touch ID"];break;}}});}];

指纹识别的版本问题

1.iOS 9 之前是没有LAErrorTouchIDLockout锁定这个选项的,默认错误5次后;第6次验证是自动弹出输入密码界面;

2.iOS 9 之后锁定指纹识别之后,如果需要立即弹出输入密码界面需要使用LAPolicyDeviceOwnerAuthentication这个属性重新发起验证;

弹窗显示级别问题

TouchID的弹窗的级别非常之高,高到离谱,经过验证应用程序内部没有比指纹识别的window的级别更高的UIWindowLevel,也就说了他是系统级的弹窗。需要注意的是,如果指纹弹窗显示和消失应用程序会调用:

- (void)applicationWillResignActive:(UIApplication *)application;
- (void)applicationDidBecomeActive:(UIApplication *)application;

只要你的app进入后台或者打开使用都可以弹出TouchID页面,具体显示逻辑视情况判断;

目前以上代码足可以满足大多数app中TouchID的使用,不足之处敬请指出;
demo地址:https://github.com/XGPASS/XGTouchDemo

参考文章:1.http://www.jianshu.com/p/d44b7d85e0a6
2.http://zcill.com/2016/02/29/LocalAuthentication%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0/

iOS开发 手势密码解锁和指纹TouchID解锁相关推荐

  1. iOS 九宫格手势密码

    代码地址如下: http://www.demodashi.com/demo/11490.html 一.准备工作 需要准备什么环境 xcode,iOS8+ 本例子实现什么功能 主要实现手势密码设置,验证 ...

  2. iOS开发——手势识别器(用手势实现图片旋转和缩小放大)

    iOS开发中,除了有关触摸的这组方法来控制用户的手指触控外,还可以用UIGestureRecognize的衍生类来进行判断,方便了开发. UIGestureRecognize的子类类别有以下几种: U ...

  3. IOS 开发 手势使用

    首先为了防止看我的博客的人刚打开就关闭,所以就先给个手势的例子 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] ...

  4. ios开发 html 字体模糊效果,CSS3实现苹果手机解锁的字体闪亮效果示例

    0.前言 2016年08月18日 今天看到注意到苹果手机的滑动解锁,提示字上会有一道白光闪过,感觉很炫酷,所以突然就来了兴致想要做一个当鼠标放在字体上(模拟手指)时,白光一闪而过,照亮字体的效果. 1 ...

  5. iOS开发--下滑返回dismiss

    简介 现在越来越多的应用有看大图或者进入详情页面,但是,再返回的时候,普通意义上,会点击左上角的返回,这时候你就会发现,还需要将手指移动到左上角,这样,无意给用户增添了麻烦,并且,现在手机屏幕越来越大 ...

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

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

  7. IOS开发基础之手势解锁项目案例

    IOS开发基础之手势解锁项目案例 项目最终实现效果. 由于缺少红色的error背景图.我自己从安卓项目找到一个手势解锁,然后通过ps添加粉红色的红圈,才得以解决.为了分享给大家源码,github和本地 ...

  8. swift 实现iOS手势密码、指纹密码、faceID

    本博客包含了如何实现iOS手势密码.指纹密码.faceID全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBTouchID,支持swift3. ...

  9. 手势密码与TouchID

    手势密码 绘制: 首先for循环添加布局九个圆形btn,给btn加上9个对应的tag值,btn上面的图片采用绘制的方法,分别绘制出btn的未选中状态.选中状态.选错状态对应的图片 创建一个可变数组,用 ...

  10. iOS开发指纹/面容识别

    1.info.plist中增加NSFaceIDUsageDescription权限申请说明 <key>NSFaceIDUsageDescription</key> <st ...

最新文章

  1. 初始化java工具失败,spring初始化失败解决办法
  2. word 分栏后转html,分栏怎么让两边一样 怎样让word文档分栏而顺序不变
  3. nginx 静态文件
  4. 力扣题目——1557. 可以到达所有点的最少点数目
  5. OpenCV-Python实战(19)——OpenCV与深度学习的碰撞
  6. redis安装配置参考
  7. SilverLight4导航
  8. android程序设计学习,android编程入门很简单 android编程入门自学
  9. dsp的ad标志位是什么_DSP简简单单学习之AD采样
  10. 排列组合之生成排列_(:з」∠)_
  11. 输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。
  12. linux文件目录基本操作实验结论,实验 Linux文件和目录操作
  13. 动态壁纸android,Android 十大最新版本动态壁纸大盘点
  14. 7. 从0学ARM-GNU伪指令、代码编译,lds使用
  15. 家居美学新主张——冰箱天然紫晶着色,可绘画面板!
  16. Java工程师学习指南 入门篇
  17. 你应该要懂的宇宙真相——《给忙碌者的天体物理学 》下篇
  18. 厉害了!世界首例AI诈骗案出现:公司高管接老板电话被骗22万欧元
  19. 第五届世界人工智能大会 • 腾讯“智变未来”论坛召开
  20. 对香农采样定理的理解

热门文章

  1. 作业中关于H5中动画的实现——animation
  2. MD-Pandoc进阶教程:图表、文献和目录
  3. 搭建IP代理池伪装IP地址
  4. Apache 架构师的 30 条设计原则
  5. 基于sklearn实现Bagging算法(python)
  6. 不卷了!技术团队成员集体辞职
  7. android 10.0禁用电源键(屏蔽关机短按长按事件)
  8. 债务美元是怎样“炼成”的
  9. 怎样更换计算机主板电池,如何更换电脑主板电池
  10. 计算机主板清理,电脑主板脏了如何清洗电脑主板才是正确