zoukankan      html  css  js  c++  java
  • iOS Touch ID 简易开发教程

    转自:NsstringFromName

    支持系统和机型

    iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。

    依赖框架

    LocalAuthentication.framework
    
    #import <LocalAuthentication/LocalAuthentication.h>

    注意事项

    iOS 8以下版本适配时,务必进行API验证,避免调用相关API引起崩溃。

    使用类

    LAContext 指纹验证操作对象

    代码

     1 - (void)authenticateUser
     2 {
     3     //初始化上下文对象
     4     LAContext* context = [[LAContext alloc] init];
     5     //错误对象
     6     NSError* error = nil;
     7     NSString* result = @"Authentication is needed to access your notes.";
     8     
     9     //首先使用canEvaluatePolicy 判断设备支持状态
    10     if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
    11         //支持指纹验证
    12         [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {
    13             if (success) {
    14                 //验证成功,主线程处理UI
    15             }
    16             else
    17             {
    18                 NSLog(@"%@",error.localizedDescription);
    19                 switch (error.code) {
    20                     case LAErrorSystemCancel:
    21                     {
    22                         NSLog(@"Authentication was cancelled by the system");
    23                         //切换到其他APP,系统取消验证Touch ID
    24                         break;
    25                     }
    26                     case LAErrorUserCancel:
    27                     {
    28                         NSLog(@"Authentication was cancelled by the user");
    29                         //用户取消验证Touch ID
    30                         break;
    31                     }
    32                     case LAErrorUserFallback:
    33                     {
    34                         NSLog(@"User selected to enter custom password");
    35                         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    36                             //用户选择输入密码,切换主线程处理
    37                         }];
    38                         break;
    39                     }
    40                     default:
    41                     {
    42                         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    43                            //其他情况,切换主线程处理 
    44                         }];
    45                         break;
    46                     }
    47                 }
    48             }
    49         }];
    50     }
    51     else
    52     {
    53         //不支持指纹识别,LOG出错误详情
    54         
    55         switch (error.code) {
    56             case LAErrorTouchIDNotEnrolled:
    57             {
    58                 NSLog(@"TouchID is not enrolled");
    59                 break;
    60             }
    61             case LAErrorPasscodeNotSet:
    62             {
    63                 NSLog(@"A passcode has not been set");
    64                 break;
    65             }
    66             default:
    67             {
    68                 NSLog(@"TouchID not available");
    69                 break;
    70             }
    71         }
    72         
    73         NSLog(@"%@",error.localizedDescription);
    74     }
    75 }
     1 typedef NS_ENUM(NSInteger, LAError)
     2 {
     3     //授权失败
     4     LAErrorAuthenticationFailed = kLAErrorAuthenticationFailed,
     5     
     6     //用户取消Touch ID授权
     7     LAErrorUserCancel           = kLAErrorUserCancel,
     8     
     9     //用户选择输入密码
    10     LAErrorUserFallback         = kLAErrorUserFallback,
    11     
    12     //系统取消授权(例如其他APP切入)
    13     LAErrorSystemCancel         = kLAErrorSystemCancel,
    14     
    15     //系统未设置密码
    16     LAErrorPasscodeNotSet       = kLAErrorPasscodeNotSet,
    17 
    18     //设备Touch ID不可用,例如未打开
    19     LAErrorTouchIDNotAvailable  = kLAErrorTouchIDNotAvailable,
    20     
    21     //设备Touch ID不可用,用户未录入
    22     LAErrorTouchIDNotEnrolled   = kLAErrorTouchIDNotEnrolled,
    23 } NS_ENUM_AVAILABLE(10_10, 8_0);

    操作流程

    首先判断系统版本,iOS 8及以上版本执行-(void)authenticateUser方法,方法自动判断设备是否支持和开启Touch ID

    iOS 9

     1  /// Authentication was not successful, because there were too many failed Touch ID attempts and
     2     /// Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating
     3     /// LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite.
     4     LAErrorTouchIDLockout   NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorTouchIDLockout,
     5 
     6     /// Authentication was canceled by application (e.g. invalidate was called while
     7     /// authentication was in progress).
     8     LAErrorAppCancel        NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorAppCancel,
     9 
    10     /// LAContext passed to this call has been previously invalidated.
    11     LAErrorInvalidContext   NS_ENUM_AVAILABLE(10_11, 9_0) = kLAErrorInvalidContext

    其中,LAErrorTouchIDLockout是在8.0中也会出现的情况,但并未归为单独的错误类型,这个错误出现,源自用户多次连续使用Touch ID失败,Touch ID被锁,需要用户输入密码解锁,这个错误的交互LocalAuthentication.framework已经封装好了,不需要开发者关心。

    LAErrorAppCancelLAErrorSystemCancel相似,都是当前软件被挂起取消了授权,但是前者是用户不能控制的挂起,例如突然来了电话,电话应用进入前台,APP被挂起。后者是用户自己切到了别的应用,例如按home键挂起。

    LAErrorInvalidContext很好理解,就是授权过程中,LAContext对象被释放掉了,造成的授权失败

  • 相关阅读:
    Java 开发 gRPC 服务和客户端
    Springcloud中的region和zone的使用
    Spring Boot中使用AOP记录请求日志
    JDK1.8中的Lambda表达式和Stream
    机器学习之SVM
    机器学习之决策树
    【iOS开发】emoji表情的输入思路
    block为什么要用copy,runtime的简单使用
    swift和oc混编
    iOS之AFN错误代码1016(Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable)
  • 原文地址:https://www.cnblogs.com/qq744890760/p/5121674.html
Copyright © 2011-2022 走看看