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


       iOS 8的SDK开放了Touch ID的接口.从WWDC的视频中能够看到Touch ID应用在两个方面:用于Key Chain加密和用于授权.iOS 8正式版公布以后我们能够看到Evernote的iOS app已经集成了该功能.以下来看看怎样实现使用Touch ID进行身份认证.
      事实上非常easy,用于身份认证的全部的接口都在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,例如以下图:



      该alert可定制的仅仅有两处:
      1.”To access your photos”提示文字是由localizedReason參数指定的,用来向用户说明使用Touch ID的目的.
      2.”Enter Password”可由LAContext的localizedFallbackTitle属性设置(LAContext眼下仅仅有这一个属性),假设不设置的话,默认是”Enter Password”.值得注意的是,假设该属性设置为@“”(空字符串),该button会被隐藏,Evernote应该就是这么做的.
      其它的免谈,当然更别提获取用户的指纹数据了.
      理论上三种情况下会退出验证(alert会被dismiss,reply回调会被调用):
      1.用户指纹通过验证
      2.用户点击”Enter Password”button
      3.用户点击”Cancel”button
      另一种情况:用户输入了错误的指纹.这样的情况下,该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

  • 相关阅读:
    JavaScript Hoisting
    关于性能工具
    JavaScript 新旧替换五:函数嵌套
    JavaScript 新旧替换四:继承
    JavaScript 新旧替换三:参数转换
    JavaScript 新旧替换二:赋值和取值
    test
    这么多数组方法,你掌握了么?
    问问自己,你真的会用防抖和节流么????
    防抖、节流、闭包的真谛所在
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7118107.html
Copyright © 2020-2023  润新知