iOS 8使用Touch ID进行身份认证

时间:2022-09-23 22:32:54
   iOS 8的SDK开放了Touch ID的接口.从WWDC的视频中可以看到Touch ID应用在两个方面:用于Key Chain加密和用于授权.iOS 8正式版发布以后我们可以看到Evernote的iOS app已经集成了该功能.下面来看看如何实现使用Touch ID进行身份认证.
  其实很简单,用于身份认证的所有的接口都在LocalAuthentication framework中, 该framework实际上只有三个头文件:
  LAContext.h
  LAError.h
  LAPublicDefines.h
  而实际用到的函数也只有两个:
  // 用来判断设备是否支持Touch ID
  - ( BOOL )canEvaluatePolicy:( LAPolicy )policy error:( NSError  *  __autoreleasing  *)error;
  // 真正验证身份的函数
   - ( void )evaluatePolicy:( LAPolicy )policy
       localizedReason:( NSString   *)localizedReason
                 reply:(
void (^)( BOOL   success,   NSError   *error))reply;

  上述两个函数都是LAContext的member function.目前LAPolicy只有一个值:  LAPolicyDeviceOwnerAuthenticationWithBiometrics.

  如果canEvaluatePolicy返回YES,表示设备支持指纹识别,那么便可以调用evaluatePolicy:函数进行指纹识别了.调用evaluatePolicy函数后会弹出一个alert,如下图:

iOS 8使用Touch ID进行身份认证


  该alert可定制的只有两处:
  1.”To access your photos”提示文字是由 localizedReason参数指定的,用来向用户说明使用Touch ID的目的.
  2.”Enter Password”可由LAContext的localizedFallbackTitle属性设置(LAContext目前只有这一个属性),如果不设置的话,默认是”Enter Password”.值得注意的是,如果该属性设置为@“”(空字符串),该按钮会被隐藏,Evernote应该就是这么做的.
  其他的免谈,当然更别提获取用户的指纹数据了.
  理论上三种情况下会退出验证(alert会被dismiss,reply回调会被调用):
  1.用户指纹通过验证
  2.用户点击”Enter Password”按钮
  3.用户点击”Cancel”按钮
  还有一种情况:用户输入了错误的指纹.这种情况下,该alert不会被dismiss,其标题会由”Touch ID”改为”Try Again”,有弹簧状的动画效果过渡.好了,代码如下(不要忘了引入头文件   <LocalAuthentication/LocalAuthentication.h> ):
    LAContext  *context = [ LAContext  new ];
   
   
  NSError  *error;
    context.
localizedFallbackTitle  =  @"" ;
   
   
  if  ([context  canEvaluatePolicy : LAPolicyDeviceOwnerAuthenticationWithBiometrics  error :&error]) {
       
  NSLog ( @"Touch ID is available." );
        [context
  evaluatePolicy : LAPolicyDeviceOwnerAuthenticationWithBiometrics  
                localizedReason : NSLocalizedString ( @"Use Touch ID to log in." ,  nil
                          reply :^( BOOL  success,  NSError  *error) {
             if  (success) {
               
  NSLog ( @"Authenticated using Touch ID." );
            }
  else  {
                 if  (error. code  ==  kLAErrorUserFallback ) {
                      NSLog ( @"User tapped Enter Password" );
                }
  else   if   (error. code   ==   kLAErrorUserCancel ) {
                   
  NSLog ( @"User tapped Cancel" );
                }
  else   {
                   
  NSLog ( @"Authenticated failed." );
            }
        }];
    }
  else  {
       
  NSLog ( @"Touch ID is not available: %@" , error);
    }
    在开发中遇到过一个问题, 不知道是不是bug, 就是启动程序后立即使用Touch ID, 这样会导致身份验证通过了, 但是上述的alert并不会被dismiss. 详情参见 https://github.com/RungeZhai/TouchIDIssue