iOS中指纹识别常见问题汇总

最近公司的 app 要使用指纹支付了;总体来说还是蛮顺利的;但是中间有遇到一些坑;下面就对坑进行汇总;

一.基本知识

点开这个LocalAuthentication.framework,发现里面主要有这么几个东西

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

这个没什么可讲的吧,代码就两行,一行导入LAContext.h,一行导入LAError.h,这个LocalAuthentication类是暴露出来方便开发者调用的类。

LAPublicDefines.h

先从简单的开始讲吧,首先是LAPublicDefines.h,从名字上来看是公共宏定义类,里面包含了许多定义好的宏,这些宏会在LAContext.h得到使用。

//
// LAPublicDefines.h
// LocalAuthentication
//
// Copyright (c) 2014 Apple. All rights reserved.
//
#ifndef LocalAuthentication_LAPublicDefines_h
#define LocalAuthentication_LAPublicDefines_h
// Policies
#define kLAPolicyDeviceOwnerAuthenticationWithBiometrics 1
#define kLAPolicyDeviceOwnerAuthentication 2
// Options
#define kLAOptionUserFallback 1
#define kLAOptionAuthenticationReason 2
// Credential types
#define kLACredentialTypePasscode -1
#define kLACredentialTypePassphrase -2
#define kLACredentialCTKPIN -3
// Error codes
#define kLAErrorAuthenticationFailed -1
#define kLAErrorUserCancel -2
#define kLAErrorUserFallback -3
#define kLAErrorSystemCancel -4
#define kLAErrorPasscodeNotSet -5
#define kLAErrorTouchIDNotAvailable -6
#define kLAErrorTouchIDNotEnrolled -7
#define kLAErrorTouchIDLockout -8
#define kLAErrorAppCancel -9
#define kLAErrorInvalidContext -10
// Error domain
#define kLAErrorDomain "com.apple.LocalAuthentication"
#endif

LAError.h

这个类其实也不用赘述,就是一个枚举,里面写的是错误的类型,其实就是把上面的kLAError宏写进这个枚举了,具体代码注释写的很清晰,大概翻译了一下

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

LAContext.h

重头戏来了,想在自己的项目中使用TouchID,就要用到LAContext这个类里面的方法首先映入眼帘的是一个NS_ENUM枚举LAPolicy。

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 *context = [LAContext alloc] init];创建一个LAContext对象。

canEvaluatePolicy:error:方法用来检查当前设备是否可用touchID,返回一个BOOL值

evaluatePolicy:localizedReason:reply:调用验证方法,注意这里的三个参数:

第一个参数policy是要使用上面那个LAPolicy的枚举
第二个参数localizedReason是NSString类型的验证理由
第三个参数reply则是一个回调Block,block内有一个BOOL类型的success判断是否成功验证,还有一个用于判断错误信息的NSError类型的error

invalidate方法用来废止这个context

第一次touchID 样式

错误后 touchID 样式

- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error __attribute__((swift_error(none)));
- (void)evaluatePolicy:(LAPolicy)policy
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply;
- (void)invalidate;

枚举LACredentialType,LAAccessControlOperation,这个东西和下面的几个方法我查了很久也没弄明白用在哪,苹果官方文档也看的不太懂,枚举中只有一个LACredentialTypeApplicationPassword。

不过通过这个NS_ENUM_AVAILABLE(10_11, 9_0)还有方法后面的NS_AVAILABLE(10_11, 9_0)知道这个枚举和这两个方法只能在OS X 10.11和iOS 9.0以上版本使用,所以可能是比较新的东西,后面苹果还会对他扩充吧。

下面是方法的说明:

// 目前额外加密就一种就是应用密码
// 输入进去将会是 UTF-8 的字符串
typedef NS_ENUM(NSInteger, LACredentialType)
{
LACredentialTypeApplicationPassword = 0,
} NS_ENUM_AVAILABLE(10_11, 9_0);
// 以下方法据我理解应该是:可以在验证Touch ID之后额外加密?
// 设置解锁额外加密凭证
- (BOOL)setCredential:(nullable NSData *)credential
type:(LACredentialType)type NS_AVAILABLE(10_11, 9_0);
// 判断加密凭证是否设置成功
- (BOOL)isCredentialSet:(LACredentialType)type NS_AVAILABLE(10_11, 9_0);
// 通过Touch ID来验证加密凭证是否通过
- (void)evaluateAccessControl:(SecAccessControlRef)accessControl
operation:(LAAccessControlOperation)operation
localizedReason:(NSString *)localizedReason
reply:(void(^)(BOOL success, NSError * __nullable error))reply
NS_AVAILABLE(10_11, 9_0);
typedef NS_ENUM(NSInteger, LAAccessControlOperation)
{
// 创建额外加密
LAAccessControlOperationCreateItem,
// 使用额外加密
LAAccessControlOperationUseItem,
// 创建额外加密key
LAAccessControlOperationCreateKey,
// 使用额外加密key签名
LAAccessControlOperationUseKeySign
} NS_ENUM_AVAILABLE(10_11, 9_0);

属性的话,这里有5个

@property (nonatomic, nullable, copy) NSString *localizedFallbackTitle;
@property (nonatomic, nullable, copy) NSString *localizedCancelTitle NS_AVAILABLE(10_12, 10_0);
@property (nonatomic, nullable) NSNumber *maxBiometryFailures NS_DEPRECATED_IOS(8_3, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic, nullable, readonly) NSData *evaluatedPolicyDomainState NS_AVAILABLE(10_11, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;
@property (nonatomic) NSTimeInterval touchIDAuthenticationAllowableReuseDuration NS_AVAILABLE(NA, 9_0) __WATCHOS_UNAVAILABLE __TVOS_UNAVAILABLE;

localizedFallbackTitle可以设置验证TouchID时弹出Alert的输入密码按钮的标题

localizedCancelTitle可以设置验证TouchID时弹出Alert的取消按钮的标题(iOS10才有)

maxBiometryFailures 最大指纹尝试错误次数。 这个属性我们可以看到他后面写了NS_DEPRECATED_IOS(8_3, 9_0),说明这个属性在iOS 8.3被引入,在iOS 9.0被废弃,所以如果系统版本高于9.0是无法使用的。

evalueatedPolicyDomainState这个跟可以检测你的指纹数据库的变化,增加或者删除指纹这个属性会做出相应的反应

touchIDAuthenticationAllowableReuseDuration这个属性应该是类似于支付宝的指纹开启应用,如果你打开他解锁之后,按Home键返回桌面,再次进入支付宝是不需要录入指纹的。因为这个属性可以设置一个时间间隔,在时间间隔内是不需要再次录入。默认是0秒,最长可以设置5分钟。

二.常见问题

1. 指纹识别的版本问题

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

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

如果输入了锁屏密码,指纹解密锁定会默认解除

iOS 8 错误5次锁定后,第6次验证需要密码

支付宝微信对于锁定的不同处理

2. 指纹识别的LAPolicy

第一个枚举LAPolicyDeviceOwnerAuthenticationWithBiometrics就是说,用的是手指指纹去验证的;NS_ENUM_AVAILABLE(NA, 8_0)iOS8 可用

第二个枚举LAPolicyDeviceOwnerAuthentication少了WithBiometrics则是使用TouchID或者密码验证,默认是错误两次指纹或者锁定后,弹出输入密码界面;NS_ENUM_AVAILABLE(10_11, 9_0)

iOS 9可用

3. 指纹识别LAContext的方法

canEvaluatePolicy:error:方法用来检查当前设备是否可用touchID,返回一个BOOL值;不会弹验证指纹密码框

evaluatePolicy:localizedReason:reply:调用验证方法,会弹验证指纹密码框

4. feedback按钮显示

默认第一次识别只有取消按钮

错误一次之后,会显示 feedBack 按钮

如果不想显示 feedback 按钮;可以设置 feedBackTitle = @""

设置 feedbackTitle 为@""

设置 feedbackTitle 为@"验证登录密码"

5. CancelTitle按钮显示

该属性, iOS 10 才可以进行设置,iOS 以前是不可以进行设置的

6. 指纹识别慢的问题

我的 iphone 7 Plus指纹识别启动过程需要2s 左右的时间;如果发现启动比较慢,这个是正常现象

支付宝和微信为了消除用户的紧张情绪,在开启指纹识别的时候都有放 HUD

指纹识别完成后,需要返回主线程进行相应的 操作;否者你会发现有时候识别完4-5秒才有反应

微信支付 HUD显示案例

demo的 HUD显示案例

[SVProgressHUD show];
LAContext *context = [[LAContext alloc]init];//使用 new 不会给一些属性初始化赋值
context.localizedFallbackTitle = @"";//这样可以不让 feedBack 按钮显示
//LAPolicyDeviceOwnerAuthenticationWithBiometrics
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"请验证已有指纹" reply:^(BOOL success, NSError * _Nullable error) {
[SVProgressHUD dismiss];
//SVProgressHUD dismiss 需要 0.15才会消失;所以dismiss 后进行下一步操作;但是0.3是适当延长时间;留点余量
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (success)
{
NSLog(@"指纹识别成功");
// 指纹识别成功,回主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
//成功操作
});
}
if (error) {
//指纹识别失败,回主线程更新UI
NSLog(@"指纹识别成功");
dispatch_async(dispatch_get_main_queue(), ^{
//失败操作
});
}
});
}];

7.弹窗显示级别问题

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

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

所以应用程序内部无法获取。不知道越狱之后的手机能否获取到,如果能获取到,那就不可描述了,所以推荐各位看官没什么刚需不要越狱。

8.检测指纹库中指纹是否发生改变

苹果官方文档解释如下

This property returns a value only when the canEvaluatePolicy(:error:) method succeeds for a biometric policy or the evaluatePolicy(:localizedReason:reply:) method is called and a successful Touch ID authentication is performed. Otherwise, nil is returned.
The returned data is an opaque structure. It can be used to compare with other values returned by this property to determine whether the database of authorized fingerprints has been updated. However, the nature of the change cannot be determined from this data.

总结来说:

当你增加或者删除指纹时候,你在使用使用canEvaluatePolicy(_:error:)或者evaluatePolicy(_:localizedReason:reply:)方法验证;成功后evaluatedPolicyDomainState属性会返回一个 NSData 对象;否则返回 nil;
但是返回的evaluatedPolicyDomainState属性并不能说明发生了什么样子的改变;只是告诉你发生了改变

根据上面的信息,我们就可以每次使用指纹的时候检测指纹数据库是否发生改变并作出相应的操作;下面是stackOverFlow 做的一个相应示例

demo

TouchIDDemo

以上所述是小编给大家介绍的iOS中指纹识别常见问题汇总,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • IOS 指纹识别详解及实例代码

    IOS 指纹识别,这里整理下项目中用的知识. IOS 指纹识别现在,在要求安全与效率兼得的时候,普通密码已不能满足我们的要求,指纹识别就这样诞生了. 每个人都有自己专属的指纹,在需要支付等输入密码的地方,我们只需轻轻一按即可,避免了输入密码的繁琐步骤,更加安全,而且妈妈再也不用担心我们忘记密码. 其实,听着高大上,实现起来特别简单,因为苹果已经帮我们封装好了,我们只需要简单的调用就好了. 1.首先,我们需要导入头文件: #import <LocalAuthentication/LocalAuth

  • iOS中Swift指触即开集成Touch ID指纹识别功能的方法

    1.前言 随着移动支付时代的到来,Touch ID 指纹验证迅速被支付宝,微信钱包普及,相信各位朋友使用后也大呼方便.今天写一篇关于指纹解锁的文章. 关于3D Touch 感兴趣的朋友可以看我前篇blog *    iOS- 指压即达,如何集成iOS9里的3D Touch http://www.jb51.net/article/108922.htm 2.指纹验证Touch ID的介绍 相比3D Touch来说,指纹验证Touch ID 的使用比较简单 主要分成两步 1.第一步当然是检测你的手机是

  • iOS中应用内添加指纹识别的实例代码

    iOS8之后苹果发布了指纹识别的功能,通过touch ID来识别用户,做用户授权,主要是依赖于LocalAuthentication库 指纹识别:一判断设备是否支持指纹识别功能 二识别指纹,成功后做相应的动作,失败后提醒用户指纹识别失败 先引入#import <LocalAuthentication/LocalAuthentication.h> LAContext *context = [[LAContext alloc] init]; NSError *error = nil; //验证是否

  • IOS 指纹识别两种方式详解及实例

    IOS 指纹识别两种方式详解及实例 首先引入类名: #import <LocalAuthentication/LocalAuthentication.h> 然后在实现指纹识别的地方放入如下代码: 方式一: LAContext *lacontext = [[LAContext alloc]init]; // 判断设备是否支持指纹识别 BOOL isSupport = [lacontext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWit

  • iOS中指纹识别常见问题汇总

    最近公司的 app 要使用指纹支付了;总体来说还是蛮顺利的;但是中间有遇到一些坑;下面就对坑进行汇总; 一.基本知识 点开这个LocalAuthentication.framework,发现里面主要有这么几个东西 LocalAuthentication.framework - LAContext.h - LAError.h - LAPublicDefines.h - LocalAuthentication.h LocalAuthentication.h 这个没什么可讲的吧,代码就两行,一行导入L

  • iOS开发中指纹识别简单介绍

    ios开发中指纹识别简单介绍,在iphone系列中,是从5S以后开始有了指纹识别的功能,在ios8的时候开放的指纹验证的接口. 所以我们在进行指纹识别应用的时候要去判断机型以及系统的版本. 代码如下,下面需要特别注意的其实就是LAPolicyDeviceOwnerAuthentication和LAPolicyDeviceOwnerAuthenticationWithBiometrics的区别,以及检测系统的版本通过[UIDevice currentDevice].systemVersion.fl

  • C#中Response.Write常见问题汇总

    本文实例汇总了C#中Response.Write的常见问题,分享给大家供大家参考之用.具体分析如下: 问题一: Response.Write 后连接Response.Redirect ,则Response.Write无法显示,直接跳转入Response.Redirect 的页面. 解决方式: Response.Write("<script languge='javascript'>alert('成功修改'); window.location.href='index.aspx'<

  • Java编程中的一些常见问题汇总

    本文列举了我在周围同事的Java代码中看到的一些比较典型的错误.显然,静态代码分析(我们团队用的是qulice)不可能发现所有的问题,这也是为什么我要在这里列出它们的原因. 如果你觉得少了什么,请不吝赐教,我会很乐意把它们加上. 下面列出的所有这些错误基本都与面向对象编程有关,尤其是Java的OOP. 类名 读下这篇短文"什么是对象".类应该是真实生活中的一个抽象实体,而不是什么"validators","controller", "m

  • 微信小程序 SOTER 生物认证DEMO 指纹识别功能

    今天项目尝试使用微信小程序指纹认证功能 以下为测试demo index.js Page({ /** * 页面的初始数据 */ data: { isfingerPrint : false, //可否使用指纹识别 默认false isfacial: false, //可否使用人脸识别 默认false }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { var that = this //查看支持的生物认证 比如ios的指纹识别 安卓部分机器

  • iOS Touch ID指纹识别技术简介

    Touch ID简介: 苹果公司在iPhone 5S手机中推出了指纹识别功能,提高手机安全性的同时也方便了用户操作.其功能是通过Touch ID实现的,从iOS 8系统开始,苹果开发一些Touch ID的API使得开发人员可以在自己的应用程序中调用指纹识别功能. Touch ID功能就是指纹识别密码.使用指纹识别功能需要先进入设置-Touch ID 与密码中根据提示添加指纹. 从iOS 8系统开始开放了Touch ID的验证接口功能,在应用程序中可以判断输入的Touch ID是否设置持有者的To

随机推荐