iOS 中 Touch ID 的使用

Touch ID 用于直接登陆还是相当方便的,为此我们项目最近特意加了一下这个需求。

首先我们得引入“LocalAuthentication”这个库,然后导入#import 就可以正常使用

注意这两个方法就好了

 //是否可以用 Touch ID 
- (BOOL)canEvaluatePolicy:(LAPolicy)policy error:(NSError * __autoreleasing *)error;
//用Touch ID后,返回的结果,是否成功
- (void)evaluatePolicy:(LAPolicy)policy
   localizedReason:(NSString *)localizedReason
             reply:(void(^)(BOOL success, NSError *error))reply;

直接上传代码

 LAContext *context = [[LAContext alloc] init];
NSError *error;
context.localizedFallbackTitle = @"输入登陆密码";

/**
 注意两者的区别,
 首先支持的版本不同、
 //LAPolicyDeviceOwnerAuthentication  iOS 9.0 以上
 //kLAPolicyDeviceOwnerAuthenticationWithBiometrics  iOS 8.0以上
 其次输入 密码次数有关
 用kLAPolicyDeviceOwnerAuthenticationWithBiometrics 就好拉
 
 最主要的是,前者  使用“context.localizedFallbackTitle = @"输入登陆密码";”
 上面这个属性的时候,不能按我们设定的要求走,它会直接弹出验证
 
 所以还是用后者,kLAPolicyDeviceOwnerAuthenticationWithBiometrics 
 
 */

if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
{
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
            localizedReason:NSLocalizedString(@"Home键验证已有手机指纹", nil)
                      reply:^(BOOL success, NSError *error)
    {
                          if (success)
                          {
                              NSLog(@"验证通过");
                          }
                          else
                          {
                              switch (error.code)
                              {
                                    
                                  case LAErrorUserCancel:
                                      //认证被用户取消.例如点击了 cancel 按钮.
                                      NSLog(@"密码取消");
                                      break;
                                      
                                  case LAErrorAuthenticationFailed:
                                      // 此处会自动消失,然后下一次弹出的时候,又需要验证数字
                                      // 认证没有成功,因为用户没有成功的提供一个有效的认证资格
                                      NSLog(@"连输三次后,密码失败");
                                      break;
                                      
                                  case LAErrorPasscodeNotSet:
                                      // 认证不能开始,因为此台设备没有设置密码.
                                      NSLog(@"密码没有设置");
                                      break;
                                      
                                  case LAErrorSystemCancel:
                                      //认证被系统取消了(例如其他的应用程序到前台了)
                                      NSLog(@"系统取消了验证");
                                      break;
                                      
                                  case LAErrorUserFallback:
                                      //当输入觉的会有问题的时候输入
                                      NSLog(@"登陆");
                                      break;
                                   case LAErrorTouchIDNotAvailable:
                                       //认证不能开始,因为 touch id 在此台设备尚是无效的.
                                      NSLog(@"touch ID 无效");
                                      
                                  default:
                                      NSLog(@"您不能访问私有内容");
                                  break;
                              }
                          }
    }];
}
else
{

    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"您的Touch ID 设置 有问题" message:nil delegate:self cancelButtonTitle:@"知道了" otherButtonTitles:nil, nil];

    switch (error.code) {
        case LAErrorTouchIDNotEnrolled:
            alert.message = @"您还没有进行指纹输入,请指纹设定后打开";
            break;
        case  LAErrorTouchIDNotAvailable:
             alert.message = @"您的设备不支持指纹输入,请切换为数字键盘";
            break;
        case LAErrorPasscodeNotSet:
             alert.message = @"您还没有设置密码输入";
            break;
        default:
            break;
    }
    [alert show];

    
}

附加从设备和系统判断是否是支持TouchID,有点取巧

是否是iOS8.0以上的系统
#define IOS8_OR_LATER   ( [[[UIDevice currentDevice] systemVersion] compare:@"8.0"] != NSOrderedAscending )
是否是5s以上的设备支持
+ (NSString *)platform
{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
    free(machine);
    return platform;
}

// 判断是否支持TouchID,只判断手机端,ipad端我们不支持
 #define IS_Phone        (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone
+ (BOOL)judueIPhonePlatformSupportTouchID
 {
/*
 if ([platform isEqualToString:@"iPhone1,1"])   return @"iPhone1G GSM";
 if ([platform isEqualToString:@"iPhone1,2"])   return @"iPhone3G GSM";
 if ([platform isEqualToString:@"iPhone2,1"])   return @"iPhone3GS GSM";
 if ([platform isEqualToString:@"iPhone3,1"])   return @"iPhone4 GSM";
 if ([platform isEqualToString:@"iPhone3,3"])   return @"iPhone4 CDMA";
 if ([platform isEqualToString:@"iPhone4,1"])   return @"iPhone4S";
 if ([platform isEqualToString:@"iPhone5,1"])   return @"iPhone5";
 if ([platform isEqualToString:@"iPhone5,2"])   return @"iPhone5";
 if ([platform isEqualToString:@"iPhone5,3"])   return @"iPhone 5c (A1456/A1532)";
 if ([platform isEqualToString:@"iPhone5,4"])   return @"iPhone 5c (A1507/A1516/A1526/A1529)";
 if ([platform isEqualToString:@"iPhone6,1"])   return @"iPhone 5s (A1453/A1533)";
 if ([platform isEqualToString:@"iPhone6,2"])   return @"iPhone 5s (A1457/A1518/A1528/A1530)";
 */

        if(IS_Phone)
        {
            if([self platform].length > 6 )
            {
                
                NSString * numberPlatformStr = [[self platform] substringWithRange:NSMakeRange(6, 1)];
                NSInteger numberPlatform = [numberPlatformStr integerValue];
                // 是否是5s以上的设备
                if(numberPlatform > 5)
                {
                    return YES;
                }
                else
                {
                    return NO;
                }

            }
            else
            {
                return NO;
            }
        }
        else
        {
            // 我们不支持iPad 设备
            return NO;
        }

  }

参考链接

http://www.tuicool.com/articles/zEbEjaB

你可能感兴趣的:(iOS 中 Touch ID 的使用)