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

最新文章

  1. MySQL高级查询 之 与 Group By 一起使用的函数 和 关键字
  2. 用VS开发PHP扩展
  3. vs------连接MySQL
  4. java 面向对象编程--第十四章 多线程编程
  5. Github上LeakCanary编译报错CreateProcess error=2的解决方法
  6. Spark Streaming揭秘 Day26 JobGenerator源码图解
  7. HttpWebRequest
  8. SQL viewId 比较好看的 Id
  9. 232. Implement Queue using Stacks,225. Implement Stack using Queues
  10. Project configuration is not up-to-date with pom.xml错误解决方法
  11. MyEclipse报错 Building workspace has encountered a problem Errors occurred during the build 的2种解决方法
  12. phpmyadmin 免登陆
  13. 为什么delete指针后指针设为null(已解答)
  14. 关于 win10启动错误 Error:16
  15. Nginx Web服务应用
  16. Openwrt配置小记
  17. redis 一些操作命令
  18. 安卓工作室 文件浏览器 android studio File browser
  19. python 基础 元组()
  20. swift3.0:CoreData的使用

热门文章

  1. css3 animate基本属性
  2. NOIP 2012 D1T1 Vigen&#232;re密码
  3. 关于原生app、webApp、混合app的介绍
  4. Android入门知识
  5. 基于连接的Java网络编程
  6. 三维投影总结:数学原理、投影几何、OpenGL教程、我的方法
  7. spring中log4j的使用---转载
  8. React+Antd遇到的坑
  9. 【JS】【30】各种正则
  10. Windows Server菜鸟宝典之一:Windows Server 2008 R2 AD服务器搭建