iOS8开放了很多API,包括HomeKit、HealthKit什么的。我们这里要说的是其中之一的Touch ID验证。

以前用app保护用户的隐私内容,只能设定和输入密码。眼看着只能是iPhone本身用Touch ID方便酷炫的解锁而自己的app不能。实在让人捉急。现在咱也可以酷炫一把了。当用户打开使用了Touch ID认证的app查看什么内容的时候就只能是把手指放在Home键上去验证身份。在app中验证的指纹就是用户在手机里的指纹。是的,你的app无需用户再输入一次验证用的指纹了。所以使用起来还是很方便的。不过你要做好其他的准备。就像iPhone解锁少不了密码输入一样。用户如果没有开启Touch ID咱的app也不能扒瞎不是?

如题所述,这个项目使用Swift来实现的。如果你的swift不熟的话,需要略微补补脑哦。

说了这么多,看看效果吧

看到了吧。只要把大拇指放在Home键上就会解锁了。

界面布局是这样的:

这里是通过点击按钮触发验证的。点了Authenticate按钮之后弹出第一张图的验证提示。

好啦,进入正题。

首先创建一个项目。名字啊什么的就随你的便了都可以。但是编程语言,这里需要选择Swift。既然xcode6.0.1已经号称提供了对swift的全面支持。那我们就直接上swift了。实在不行还可以通过苹果提供的机制调用已有的ObjC代码。总之五个字:这都不是事。而且swfit本来也可以省很多的代码量。项目的其他的地方保持默认选择就可以。也就是我们省点事,直接用storyboard就好了。虽然其实没有什么界面元素可以省略了。。。

在创建好的项目里,选择Build Phases。把LocalAuthentication的framework引入项目。到这里项目的设置就可以了。

在代码中import引入的framework。

1
import LocalAuthentication

接下来创建一个按钮:

1
2
3
var authButton: UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
authButton.frame = CGRect(x: 100, y: screenHeight / 2, width: 100, height: 30)
authButton.setTitle("Authenticate", forState: UIControlState.Normal)

这里是创建按钮的代码。首先创建一个和系统同类型的按钮。UIButton.buttonWithType(UIButtonType.System)返回的是一个AnyObject类型的对象,所以需要强制类型转换成UIButon的。AnyObject和Any这两个类型会经常遇到。主要是为了和ObjC之前的代码想兼容。所以也会经常的用is或者as操作符检测和强制类型转换。

  • AnyObject是指任何一个class类型的实例
  • Any是指任何一个类型的实例

比如,AnyObject数组可以存放任意某个class类型的实例。这些实例都是class类型,而且是同一个类型的。Any的数组则可以放任意类型的实例,而且这些数组成员的类型不一定是一样的。

创建UIButton的代码和之前用OC的方式没有什么太大的区别。只不过换成了swift的语法。有了按钮以后,也就该设定按钮点击事件的处理方法了。还记得不addTarget:

1
authButton.addTarget(self, action: Selector("addPassAction:"), forControlEvents: UIControlEvents.TouchUpInside)

先看看addTarget的声明:func addTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents:UIControlEvents) 对应在方法的调用中可以看到self就是AnyObject的target,不用多说什么了。后面的action是一个Selector的结构体(struct)。我们在调用的时候初始化了一个Selector的结构体。这个参数也可以直接给出action的字符串,而不用初始化Selector这个结构体。这里涉及到了一个类型自动转换的知识点。Selector的构造函数需要提供一个字符串作为参数,所以如果直接给出字符串的时候编译器会直接把这个字符串作为参数初始化一个Selector的结构体出来。Selector的字符串内容中,最后是一个冒号“:”,和ObjC的写法一样的。冒号说明方法有一个参数。最后是UIControlEvents的枚举类型。这里总于不用每次都写的那么长了。

然后,实现Selector:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func addPassAction(sender:UIButton!){
        println("add pass action")
        var laContext = LAContext()
        var authError : NSError?
        var errorReason = "keep things secret"
        if laContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError){
            laContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: errorReason, reply: {
                (success, error) in
                if success {
                    println("succeed")
                }
                else{
                    println("failed")
                }
            })
        }
        else{
            var alert = UIAlertView(title: "Can not do authenticatation", message: "", delegate: nil, cancelButtonTitle: "Cancel")
        }
    }

这里最重要的就是Touch ID验证的功能了。var laContext = LAContext()用到了类型推断。给变量初始化的实例是什么类型的,这个变量就自动推断为是那个类型。var authError : NSError? 类型推断和optional value。optional value就是在类型的后面加了一个问号。表示这个值可以是某个实例也可以是nil。注意:swift的nil和ObjC的nil是两回事。ObjC的nil是引用类型的一个空值。swift的nil就是说此变量没有值,是不是引用类型都可以。var errorReason = "keep things secret"这个字符串是要在界面中现实的。所以绝对不可以为空!

laContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError)检查设备是不是可以用biometrics的方法验证身份。就是看看能不能指纹解锁。没有硬件,或者有硬件没设定好指纹的都是不可以验证的。好的,如果已经设定好了指纹,那么就可以解锁了。

laContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: errorReason, reply: {

                (success, error) in

                if success {

                    println("succeed")

                }

                else{

                    println("failed")

                }

            })

后面的replay参数是一个返回值为空的closure。这个closure的参数是bool和NSError!closure的一般形式是{(参数1, 参数2)->返回值类型 in //代码}success返回验证结果,成功活失败(true或false)。这时,根据验证的成功或者失败,替换掉println("succeed")或者println("failed")语句,实现你需要实现的功能。比如,进入app的功能详细页等用Touch ID保护的信息。如果无法验证,就跳转到密码验证部分。这样用户在指纹验证无法进行的情况下还可以通过输入密码进入到app的功能部分。

就到这里了。写个项目试试吧!

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!

Swift实现Touch ID验证相关推荐

  1. iOS开发中Touch ID的使用

    从2013年的iPhone 5s开始苹果就引入了Touch ID,之后Touch ID基本上成了苹果设备的标配,iOS 8起,开发者就可以调用API在自己的应用中添加Touch ID验证功能了,国内常 ...

  2. iOS-Touch ID验证指纹检测以及识别

    废话不说,直接代码拿走: .h文件 // Copyright © 2017年 rjx. All rights reserved. #import <Foundation/Foundation.h ...

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

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

  4. 爆料者称苹果仍在继续研发iPhone屏下Touch ID

    据国外媒体报道,据一名知名苹果爆料人士透露,苹果正在继续研发可嵌入屏幕下方的指纹技术,并且在未来可能会发布一款带有屏下Touch ID(指纹识别)传感器的iPhone. 这条推文很简单,只有一句话: ...

  5. iOS Touch ID 简易开发教程

    基础知识 支持系统和机型 iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8,虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所 ...

  6. Touch ID使用

    前言:如果图片看不了请移步:简书 Touch ID简介 Touch ID指纹识别作为iPhone 5s上的"杀手级"功能早已为人们所熟知,目前搭载的设备有iphone SE.iPh ...

  7. 无法在此iPhone上激活Touch ID,怎么解决?

    Touch ID是苹果公司的指纹识别功能,允许用户解锁iPhone或iPad.在苹果商店购物,以及在应用程序中验证Apple Pay等等. 更新到iOS 15后,一些用户遇到了"无法在此iP ...

  8. Touch ID回归,为用户对苹果最期待功能

    本文转载自IT之家 IT之家 5 月 14 日消息 根据 SellCell.com 的一项调查,大多数苹果用户期待的功能是 Touch ID 的回归.苹果此前一直在逐步淘汰指纹传感器,转而使用 Fac ...

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

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

最新文章

  1. Media Player网页播放音频,视频,图片总汇
  2. linux下多线程实现服务端
  3. 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”
  4. 分类模型的评估方法-精确率(Precision)
  5. Modbus通信协议 【 初识 Modbus】
  6. NameError: name 'sys' is not defined
  7. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)
  8. 用 CSS 实现 Firefox 和 IE 都支持的半透明效果
  9. appium python很慢_appium+python自动化测试遇到的坑及处理方案
  10. 资源分享·病毒样本下载资源分享
  11. 吉安市推行“区块链+电子证照+无证办理”模式
  12. ACM32 MCU元器件AD封装库
  13. 刚入职蚂蚁金服!应届生拿到年薪30w,这份Java面经分享给你!
  14. Memcached详解
  15. Something‘s wrong--perhaps a missing \item. \begin{thebibliography}{1}
  16. AS星尘(stardust)粒子系统 学习 3
  17. android oreo_您的手机何时将获得Android Oreo?
  18. 双千兆网口路由器方案开发板香橙派R1 Plus LTS连接USB无线网卡测试说明(OpenWRT 系统)
  19. CentOs服务器nginx重启
  20. 【无标题】输入和输出

热门文章

  1. 从源码角度分析MapReduce的map-output流程
  2. swift_040(Swift闭包声明与用途)
  3. 「PKUWC2018」Minimax
  4. 接口自动化测试的几个阶段
  5. 卷积神经网络要点解析
  6. oracle vm virtualbox安装centos并配置Java环境
  7. 排序---初级排序算法(选择排序、插入排序和希尔排序)
  8. Python【Python基础】
  9. 科普:WiFi是谁申请的专利?高通吗?错!
  10. SQLServer 2008 :error 40 出现连接错误