一、什么是Touch ID?

Touch ID是在iPhone 5s后的设备上出现的指纹识别。Apple在IOS 8中开放给第三方APP使用。 可以使用 Touch ID 来验证用户的身份,用户经验证后才能访问你 app 中的部分或全部内容。指纹数据将受到保护,不会被 iOS 或其他 app 存取。另外即将推出的Apple pay也是与Touch ID紧密相关的。

二、比较适合哪些应用场景?

涉及到个⼈私密性信息较强的应⽤(银⾏账号密码等)

优点:相对于以往的密码验证更安全,方便;

缺点:当前每台设备最多设置5个Touch ID,重启手机需要重新输入密码。

三、如何使用?

1.验证Touch ID是否可用,即当前设备是否支持Touch ID,且用户是否在设置中设置了一个Touch ID

  1. - (void)canEvaluatePolicy
  2. {
  3. LAContext *context = [[LAContext alloc] init];
  4. __block NSString *msg;
  5. NSError *error;
  6. BOOL success;
  7.  
  8. // test if we can evaluate the policy, this test will tell us if Touch ID is available and enrolled
  9. success = [context canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
  10. if (success) {
  11. msg =[NSString stringWithFormat:NSLocalizedString(@"TOUCH_ID_IS_AVAILABLE", nil)];
  12. } else {
  13. msg =[NSString stringWithFormat:NSLocalizedString(@"TOUCH_ID_IS_NOT_AVAILABLE", nil)];
  14. }
  15. [super printResult:self.textView message:msg];
  16.  
  17. }

  

2.验证

  1. - (void)evaluatePolicy
  2. {
  3. LAContext *context = [[LAContext alloc] init];
  4. __block NSString *msg;
  5.  
  6. // show the authentication UI with our reason string
  7. [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"UNLOCK_ACCESS_TO_LOCKED_FATURE", nil) reply:
  8. ^(BOOL success, NSError *authenticationError) {
  9. if (success) {
  10. msg =[NSString stringWithFormat:NSLocalizedString(@"EVALUATE_POLICY_SUCCESS", nil)];
  11. } else {
  12. msg = [NSString stringWithFormat:NSLocalizedString(@"EVALUATE_POLICY_WITH_ERROR", nil), authenticationError.localizedDescription];
  13. }
  14. [self printResult:self.textView message:msg];
  15. }];
  16.  
  17. }

  支持自定义密码验证:

  1. - (void)evaluatePolicy2
  2. {
  3. LAContext *context = [[LAContext alloc] init];
  4. __block NSString *msg;
  5.  
  6. // set text for the localized fallback button
  7. context.localizedFallbackTitle = NSLocalizedString(@"TOUCH_ID_FALLBACK",nil);
  8.  
  9. // show the authentication UI with our reason string
  10. [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"UNLOCK_ACCESS_TO_LOCKED_FATURE", nil) reply:
  11. ^(BOOL success, NSError *authenticationError) {
  12. if (success) {
  13. msg =[NSString stringWithFormat:NSLocalizedString(@"EVALUATE_POLICY_SUCCESS", nil)];
  14. } else {
  15. msg = [NSString stringWithFormat:NSLocalizedString(@"EVALUATE_POLICY_WITH_ERROR", nil), authenticationError.localizedDescription];
  16. }
  17. [self printResult:self.textView message:msg];
  18. }];
  19.  
  20. }

 

四、KeyChain 验证

说到Touch ID就必须提Keychain,系统提供给APP存放密码的”数据库“。一般我们将密码存在APP 的独立存储中,当用户删除APP后其密码也就一并删除了,用Keychain可以将用户的密码长久保存。以前获取keychain中的密码需要输入设备的密码,有了Touch ID后就可以更安全快捷的获取密码。另外,⾃⼰的程序只能访问⾃⼰的keychain,相同bundle的程序通过设置group可以互相共享同组的keychain,从⽽实现程序间可以共同访问⼀些数

据。

旧的未使用Touch ID的方式添加密码到Keychain:

  1. NSDictionary *attributes = @{
  2. (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
  3. (__bridge id)kSecAttrService: @"SampleService",
  4. (__bridge id)kSecValueData: [@"SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding],
  5. (__bridge id)kSecUseNoAuthenticationUI: @YES,
  6. // (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
  7. };
  8.  
  9. dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  10. OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
  11.  
  12. NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_STATUS", nil), [self keychainErrorToString:status]];
  13. [self printResult:self.textView message:msg];
  14. });

  使用Touch ID的 方式:

  1. NSDictionary *attributes = @{
  2. (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
  3. (__bridge id)kSecAttrService: @"SampleService",
  4. (__bridge id)kSecValueData: [@"SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding],
  5. (__bridge id)kSecUseNoAuthenticationUI: @YES,
  6. (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
  7. };
  8.  
  9. dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  10. OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
  11.  
  12. NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_STATUS", nil), [self keychainErrorToString:status]];
  13. [self printResult:self.textView message:msg];
  14. });

  

删除keychain中的密码:

  1. - (void)deleteItemAsync
  2. {
  3. NSDictionary *query = @{
  4. (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
  5. (__bridge id)kSecAttrService: @"SampleService"
  6. };
  7.  
  8. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  9. OSStatus status = SecItemDelete((__bridge CFDictionaryRef)(query));
  10.  
  11. NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_DELETE_STATUS", nil), [self keychainErrorToString:status]];
  12. [super printResult:self.textView message:msg];
  13. });
  14. }

  

更新KeyChain中的密码:

  1. - (void)updateItemAsync
  2. {
  3. NSDictionary *query = @{
  4. (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
  5. (__bridge id)kSecAttrService: @"SampleService",
  6. (__bridge id)kSecUseOperationPrompt: @"Authenticate to update your password"
  7. };
  8.  
  9. NSDictionary *changes = @{
  10. (__bridge id)kSecValueData: [@"UPDATED_SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding]
  11. };
  12.  
  13. dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  14. OSStatus status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)changes);
  15. NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_UPDATE_STATUS", nil), [self keychainErrorToString:status]];
  16. [super printResult:self.textView message:msg];
  17. });
  18. }

  

获取Keychain中的密码:

  1. - (void)copyMatchingAsync
  2. {
  3. NSDictionary *query = @{
  4. (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
  5. (__bridge id)kSecAttrService: @"SampleService",
  6. (__bridge id)kSecReturnData: @YES,
  7. (__bridge id)kSecUseOperationPrompt: NSLocalizedString(@"AUTHENTICATE_TO_ACCESS_SERVICE_PASSWORD", nil)
  8. };
  9.  
  10. dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  11. CFTypeRef dataTypeRef = NULL;
  12. NSString *msg;
  13.  
  14. OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);
  15. if (status == errSecSuccess)
  16. {
  17. NSData *resultData = ( __bridge_transfer NSData *)dataTypeRef;
  18. NSString * result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
  19.  
  20. msg = [NSString stringWithFormat:NSLocalizedString(@"RESULT", nil), result];
  21. } else {
  22. msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_COPY_MATCHING_STATUS", nil), [self keychainErrorToString:status]];
  23. }
  24. [self printResult:self.textView message:msg];
  25. });
  26. }

  

Demo地址:https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html#//apple_ref/doc/uid/TP40014530-Intro-DontLinkElementID_2

IOS 8 关于 Touch ID的更多相关文章

  1. iOS指纹识别Touch ID的安全性探讨

    苹果公司在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是 Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.此后,苹果还将此技术带到了 iPad 上.此前没有任何 ...

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

    iOS 8的SDK开放了Touch ID的接口.从WWDC的视频中能够看到Touch ID应用在两个方面:用于Key Chain加密和用于授权.iOS 8正式版公布以后我们能够看到Evernote的i ...

  3. iOS 使用Touch ID 校验[新增 iOS9 三种错误]

    iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验.开发者们可使用向第三方应用开放了Touch ID权限的API,以便他们在应用中使用指纹认证来完成用户认证或支付购 ...

  4. iOS 中 Touch ID得使用方法

    iPhone 5S公布以后,iOS设备基本都有集成Touch ID.而这个功能对自己的App也是一个非常好的扩展,关于Touch ID的使用方法.大致例如以下, Swift: 引入LocalAuthe ...

  5. iOS Touch ID 身份认证

    iOS Touch ID 身份认证 iOS 8 及以后录了指纹的设备可以使用 touch ID 进行身份认证,指纹符合录入的指纹才能认证成功. 步骤 导入 LocalAuthentication 框架 ...

  6. iOS 8 中如何集成 Touch ID 功能

    2013年9月,苹果为当时发布的最新iPhone产品配备了一系列硬件升级方案.在iPhone 5s当中,最具创新特性的机制无疑要数围绕Home按钮设计的超薄金属圈,也就是被称为Touch ID的指纹传 ...

  7. iOS --- Touch ID指纹解锁

    https://www.cnblogs.com/ljmaque/p/TouchID.html 最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实 ...

  8. 保护 iOS 用户数据安全: Keychain 和 Touch ID

    原文:How To Secure iOS User Data: The Keychain and Touch ID 作者:Tim Mitra 译者:kmyhy 更新说明:本教程由 Tim Mitra ...

  9. iOS Touch ID 简易开发教程

    转自:NsstringFromName 支持系统和机型 iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁 ...

随机推荐

  1. Aspose插件

    Eclipse安装地址: http://apps.aspose.com/marketplace/eclipse/asposewizardrepo

  2. JS组件系列——KnockoutJS用法

    前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...

  3. c#操作Zip压缩文件

    SharpZipLib 文件/文件夹压缩 一.ZipFile ZipFile类用于选择文件或文件夹进行压缩生成压缩包. 常用属性: 属性 说明 Count 文件数目(注意是在ComitUpdat之后才 ...

  4. ajax+php+mysql更新

    html代码 <input type="button" id="quxiao" class="quxiao" name="q ...

  5. sizeclass

    横竖9种组合,代表所有大小屏幕,在storyboard中可以把contrans与不同组合绑定,也就是说,可能横向有多一个约束,纵向就没了... 实现不同屏幕不同约束,这应该是sizeclass 的存在 ...

  6. javascripy的innerHTML在IE8下的异常

    使用jQuery的datatable插件的时候发现,IE8下显示异常,仔细调查一番,发现是浏览器对innerHTML的差异导致的. 实例代码: var nTd = document.createEle ...

  7. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  8. SQL基础篇---函数及其函数配套使用的关键字

    一.数值函数 知识点1 SUM 求总和 SELECT breakfast,sum(price) FROM my_foods GROUP BY breakfast ORDER BY SUM(price) ...

  9. oracle分区表(整理)

    Oracle 表分区 早在8.0.5版本中,Oracle就将范围分区技术引入,现在分区功能已经越来越强大,包括支持扩展分区功能.Interval分区.外键分区.模拟列分区.以及分区建议器等.那么,分区 ...

  10. App_Store - IOS应用审核的时隐私政策模板

    隐私政策  Poposoft尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,Poposoft会按照本隐私权政策的规定使用和披露您的个人信息.但Poposoft将以高度的勤 ...