iOS 8使用Touch ID进行身份认证
2024-09-28 23:07:43
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;
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
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)
Touch ID to log in.", nil)
reply:^(BOOL success, NSError *error)
{
{
if (success)
{
NSLog(@"Authenticated
using Touch ID.");
} else {
{
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);
}
}];
} else {
NSLog(@"Touch
ID is not available: %@", error);
}
在开发中遇到过一个问题, 不知道是不是bug, 就是启动程序后马上使用Touch ID, 这样会导致身份验证通过了, 可是上述的alert并不会被dismiss. 详情參见https://github.com/RungeZhai/TouchIDIssue
最新文章
- MySQL高级查询 之 与 Group By 一起使用的函数 和 关键字
- 用VS开发PHP扩展
- vs------连接MySQL
- java 面向对象编程--第十四章 多线程编程
- Github上LeakCanary编译报错CreateProcess error=2的解决方法
- Spark Streaming揭秘 Day26 JobGenerator源码图解
- HttpWebRequest
- SQL viewId 比较好看的 Id
- 232. Implement Queue using Stacks,225. Implement Stack using Queues
- Project configuration is not up-to-date with pom.xml错误解决方法
- MyEclipse报错 Building workspace has encountered a problem Errors occurred during the build 的2种解决方法
- phpmyadmin 免登陆
- 为什么delete指针后指针设为null(已解答)
- 关于 win10启动错误 Error:16
- Nginx Web服务应用
- Openwrt配置小记
- redis 一些操作命令
- 安卓工作室 文件浏览器 android studio File browser
- python 基础 元组()
- swift3.0:CoreData的使用