FaceID

iPhoneX 提供的刷脸功能与之前的设备的TouchID类似,都是属于生物验证的范畴。苹果爸爸也是为了照顾开发者,这两个功能对应的API基本相同,对于之前支持TouchID的APP其实可以在不做任何修改的基础上兼容FaceID,只是在一些UI样式上需要修改。

  1. biometryType
    iOS11之后LAContext新增biometryType属性,调用时候可以根据这个属性来判断当前设备是使用FaceID还是TouchID,并据此做UI样式上的调整

     typedef NS_ENUM(NSInteger, LABiometryType){/// The device does not support biometry.LABiometryTypeNone API_AVAILABLE(macos(10.13.2), ios(11.2)),LABiometryNone API_DEPRECATED_WITH_REPLACEMENT("LABiometryTypeNone", macos(10.13, 10.13.2), ios(11.0, 11.2)) = LABiometryTypeNone,/// The device supports Touch ID.LABiometryTypeTouchID,/// The device supports Face ID.LABiometryTypeFaceID API_UNAVAILABLE(macos),} API_AVAILABLE(macos(10.13.2), ios(11.0)) API_UNAVAILABLE(watchos, tvos);/// Indicates the type of the biometry supported by the device.////// @discussion  This property is set only when canEvaluatePolicy succeeds for a biometric policy.///              The default value is LABiometryTypeNone.@property (nonatomic, readonly) LABiometryType biometryType API_AVAILABLE(macos(10.13.2), ios(11.0)) API_UNAVAILABLE(watchos, tvos);
    
  2. NSFaceIDUsageDescription
    使用FaceID需要在info.plist中增加NSFaceIDUsageDescription权限申请说明,这个跟定位、拍照等一样,如果不增加默认提示如下,虽然不会崩溃,但最好还是加上。

    FaceID权限.jpg

  3. 其他
    FaceID的调用方法跟TouchID一样,都是先判断再调用,具体流程参照分割线后的TouchID部分。

  4. 注意
    FaceID如果 不间断连续尝试 次数超过5次之后,会弹窗提示如下,同时不再执行reply:对应的block,这个需要注意

    超出次数.jpg

     [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricslocalizedReason:myLocalizedReasonStringreply:^(BOOL success, NSError *error) {//!!!超出次数,提示弹窗后,这里的block不会执行!!!}];
    

TouchID

iPhone 5s之后苹果推出的TouchID功能绝对是登录验证的一大神器,自此之后各种APP在涉及到登录时如果不把这一方式加上,估计都不好意思说是做APP的。这就苦了我们众程序猿,在开发中免不了要遇上各种坑。

在次我将自己曾经趟过的一些坑罗列了下

调用前的判断

在调用TouchID验证弹窗前最好先判断一下设备是否支持TouchID

    //创建安全验证对象LAContext * con = [[LAContext alloc]init];NSError * error;//判断是否支持密码验证/*** LAPolicyDeviceOwnerAuthentication 可输入手机密码的验证方式* LAPolicyDeviceOwnerAuthenticationWithBiometrics 只有指纹的验证方式*/BOOL can = [con canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];

这里有两种验证方式可选:
. LAPolicyDeviceOwnerAuthenticationWithBiometrics iOS8.0以上支持,只有指纹验证功能
. LAPolicyDeviceOwnerAuthentication iOS 9.0以上支持,包含指纹验证与输入密码的验证方式

调用TouchID

//初始化上下文对象
LAContext *context = [[LAContext alloc] init];
//localizedFallbackTitle=@“”,不会出现“输入密码”按钮
context.localizedFallbackTitle = @"";
//错误对象
NSError *error = nil;
NSString *result = @"验证信息";//判断是否支持密码验证
/***LAPolicyDeviceOwnerAuthentication 手机密码的验证方式*LAPolicyDeviceOwnerAuthenticationWithBiometrics 指纹的验证方式*/
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {if(error.code == LAErrorTouchIDLockout) {BOOL can = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];if (can) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError * _Nullable error) {}];}else{NSLog(@"调起账号密码页面失败!!!");}}}];
}

注意context.localizedFallbackTitle = @"";如果不设置空值,则AlertView弹窗默认会有“输入密码”的选项,但是在LAPolicyDeviceOwnerAuthenticationWithBiometrics模式下点击“输入密码”不会有反应;LAPolicyDeviceOwnerAuthentication模式下点击可以唤起输入手机密码页面,页面如下,其中除了“指纹”两字是你的app名称,其他都不可定制

iPhone.jpg

验证错误码的判断

系统提供的错误码

    // 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#define kLAErrorNotInteractive                          -1004#define kLAErrorBiometryNotAvailable              kLAErrorTouchIDNotAvailable#define kLAErrorBiometryNotEnrolled               kLAErrorTouchIDNotEnrolled#define kLAErrorBiometryLockout                   kLAErrorTouchIDLockout

验证失败,你可以根据实际情况将错误原因反馈给用户,比如在上面的调用TouchID代码中,当判断到TouchID被锁定,使用LAPolicyDeviceOwnerAuthentication模式再次验证,并弹出输入密码页面解锁。

if(error.code == LAErrorTouchIDLockout) {BOOL can = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];if (can) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError * _Nullable error) {}];}else{NSLog(@"调起账号密码页面失败!!!");}
}

敲黑板 看重点

前面说的都是TouchID使用时候的常规场景,下面说一下可能会忽视的重点!!

  1. 使用TouchID,必须确保app已经是活动状态!!
    使用TouchID,必须确保app已经是活动状态!!
    使用TouchID,必须确保app已经是活动状态!!
    也即是说当你调用TouchID时,必须确保程序已经收到了UIApplicationDidBecomeActiveNotification的消息,不然的话会调用失败,返回一个错误

    Code: -1004 NSLocalizedDescription: User interaction is required

    -1004这个错误码并不包含在官方SDK提供的文档中,但根据提示应该能够明白这是由于APP并没完全启动,未能提供用户交互导致。
    -1004 错误在iOS11 SDK中已经更新,对应的错误描述如下:

    /// Authentication failed, because it would require showing UI which has been forbidden
    /// by using interactionNotAllowed property.
    LAErrorNotInteractive API_AVAILABLE(macos(10.10), ios(8.0), watchos(3.0), tvos(10.0)) = kLAErrorNotInteractive,
    

我曾经因为在applicationWillEnterForeground:以及application: didReceiveRemoteNotification:两个方法中进行登录判断,过早的调用了TouchID导致-1004报错,着实被坑了一把。特别是在application: didReceiveRemoteNotification:点击消息推送启动的时,部分设备会报-1004,而有些又不会,最后费了好大劲才找到原因。

注重点:这个地方是本人多次试验,晕

  1. 同一个文件路径下的同一份代码,打包编译成多个ipa安装包,就算各个包的Bundle Identifier不同,安装到同一个设备后,也只有最后生成的那个ipa包可以启用TouchID,其他包会报Code: -1004 NSLocalizedDescription: User interaction is required的错误。
    神奇吧!!这个也是我经过了多次踩坑才发现的。开发中一份代码打多个包测试时注意下,避免再次入坑。

iOS开发使用TouchID验证登录踩过的一些坑(同时更新FaceID使用方法)相关推荐

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

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

  2. 【ios开发/Xcode】实现登录注册

    [ios开发/Xcode]实现登录注册 实现效果 源代码 实现效果 首先进入初始界面,输入账号Linchuantao,密码Linchuantao,显示登录失败(如下左图),因此需要进行注册,点击左下角 ...

  3. 【ios开发Xcode】实现登录注册

    [ios开发/Xcode]实现登录注册 实现效果 源代码 实现效果 首先进入初始界面,输入账号Linchuantao,密码Linchuantao,显示登录失败(如下左图),因此需要进行注册,点击左下角 ...

  4. (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新

    iOS开发技术分享群 147787076 [友盟+]友盟统计分析SDK已全面支持HTTPS,请IOS开发者及时升级文档(http://dev.umeng.com/analytics/ios-doc/i ...

  5. Python开发系列课程(10) - 那些年我们踩过的那些坑(上)

    那些年我们踩过的那些坑 坑01 - 整数比较的坑 在 Python 中一切都是对象,整数也是对象,在比较两个整数时有两个运算符==和is,它们的区别是: is比较的是两个整数对象的id值是否相等,也就 ...

  6. ios与android指纹识别,iOS开发实现TouchID指纹解锁

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

  7. iOS开发日记4-第三方登录(ShareSDK)

    今天博主有一个第三方登录的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 第三方登录的方法很多,最直接的方法就是去各大开发者平台申请id之后看官方文档直接集成,当然也有偷懒的方法.类似博主 ...

  8. 社会化登录踩的几个坑

    有一年没有碰QQ登录/微信登录/新浪登录的东西了,偶然间发现一些问题,在此总结一下,做一下记录. Android5以下新浪登录"回不来" 这个问题的原因挺简单的,将LoginAct ...

  9. 小程序开发-1:用户登录授权没反应-遇坑

    一个看似没有什么问题的代码,但点了好几次登录授权都没有反应. getUserProfile() {// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需 ...

  10. iOS实现简书的登录验证方式(极验验证)

    开篇 我们登录简书的时候就会看到如下类似的验证方式,个人还是很喜欢这种验证方式的,想着如果把它自如自己设计的软件中还是不错的,但是我们要怎么实现这种验证效果呢,今天就来介绍一下. 图形验证码.gif ...

最新文章

  1. 工作如果没有方法,光靠苦力是不行的
  2. 如何转换高度:0; 达到高度:自动; 使用CSS?
  3. 关于使用“JS获取屏幕,浏览器,网页高度宽度”的个人思考
  4. SSM商城项目(八)
  5. 1.2.4 计算机的工作过程(从源程序到可执行文件、指令执行过程的描述)
  6. html边框有箭头,css简单实现带箭头的边框
  7. app 图标规格参考表
  8. python中fd和rt是什么意思_python中fd()是什么
  9. Softaken Unlock PDF Files v1.0 PDF文件解密
  10. 深入理解ARM体系架构(S3C6410)---认识S3C6410
  11. MySQL中通过结构化文本倒腾数据
  12. 运筹学教学|十分钟快速掌握割平面法及对偶单纯形法(附Java代码及算例)
  13. Mysql Workbench 8,连接时显示An AppArmor policy prevents this sender from sending this message to this rec
  14. Spring实例(DI注入)——女生追男生
  15. 复旦961-软件工程笔记
  16. 计算机电子科学技术产品,关于电子信息科学技术发展现状的思考
  17. 例子, 防火墙配置domian比较策略
  18. Android通过DeepLink方式跳转其他App传递参数
  19. NSDate-日期类nbsp;OC——第七天(1)
  20. css实现多个div自适应高度(一样高)

热门文章

  1. Vmware虚拟机的linux与主机共享
  2. 数据库系统工程师输给了计算机等级考试二级
  3. 项目管理学习笔记五:项目整体管理
  4. innerHTML和innerText的使用和区别
  5. bzoj 4289 TAX —— 点边转化
  6. 学习python: x+=1 与 x = x + 1
  7. 针对建筑设计开发的CAD软件——ARCHICAD 24 for mac
  8. Mindomo Desktop for Mac(思维导图)中文版
  9. Tuxera NTFS有什么优点可以让我们使用?
  10. iOS底层探索之多线程(十一)—GCD源码分析(调度组)