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。

import LocalAuthentication

接下来创建一个按钮:

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:

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:

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的功能部分。

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

Swift实现Touch ID验证的更多相关文章

  1. Touch ID指纹解锁使用

    Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心密码被别人看到,另 ...

  2. 解决使用Touch ID API在回调时界面“长时间卡住”的问题

    Touch ID是iOS8上新公开的API,关于详细介绍和用法可以看CocoaChina的这两篇文章:上 和 下,在此篇文章中不再赘述. 我在app中需要的效果是如果touch id验证通过,则页面p ...

  3. iOS Touch Id 开发

    Touch Id Touch Id是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心 ...

  4. iOS8.0如何使用Touch ID来做验证

    对于Objective-C而言,只要几行代码即可搞定. 比如: #import <LocalAuthentication/LocalAuthentication.h> - (void)vi ...

  5. Touch ID 实现

    Touch ID 1.要求 机型:iPhone 5s以上 系统:iOS8以上 框架:#import <LocalAuthentication/LocalAuthentication.h> ...

  6. Touch ID使用

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

  7. 微信将推指纹支付 "指付通"会与Touch ID整合吗

    有消息称微信下一版本将推指纹支付“指付通”,解决手机丢失资金安全的问题(这个应该是针对阿里手机支付的弱点),到时候用户绑定的银行卡进行付款时,不用输入密码只需在专门的支付设备(苹果Touch ID ? ...

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

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

  9. 苹果5S指纹扫描识别传感器Touch ID有利于iPhone的安全性

    iPhone5S新增的指纹扫描识别传感器 Touch ID,黑客花了大量的时间表明指纹验证是可以被破解的.即使它可能被黑客攻击,对iPhone5S的安全性而言,仍然具有极大的好处. 为什么一个容易被破 ...

随机推荐

  1. FBString

    folly/FBString.h fbstring is a drop-in replacement for std::string. The main benefit of fbstring is ...

  2. Docker学习总结(二)—— 镜像,容器

    1.Docker镜像  1.1相关概念:registry :用于保存Docker镜像,包括镜像层次结构和镜像元数据,类似于git仓库之类的实体. repository:某个Docker镜像所有迭代版本 ...

  3. PowerMock单元测试

    在Java程序的单元测试中常用的mock工具有Mockito和EasyMock.但是这两种mock工具都无法实现对静态.final.私有方法或类的mock.因此有了功能强大的PowerMock工具.P ...

  4. 安装OpenResty

    ./configure --prefix=/data/openresty_10002 --with-luajit --with-http_stub_status_module OpenResty,也被 ...

  5. 01——微信小程序官方demo讲解——文件结构

    1.环境概览 首先环境配置的部分略过,打开小程序开发工具.选择一个空目录,即可开始一个demo项目. 其中新建成功后的目录如图所示: 2.文件结构描述 如图所示,左边是界面展示,右边是目录结构. 目录 ...

  6. bash中常用的快捷键

    常用快捷键 ctrl+c 强制终止当前命令 ctrl+l 清屏(clear) ctrl+a 光标移动到命令行行首 ctrl+e 光标移动到命令行行尾 ctrl+u 从光标所在位置删除到行首 ctrl+ ...

  7. 接口测试基础operation

    Jmeter接口测试 一般分五个步骤: (1)添加线程组 (2)添加http请求 (3)在http请求中写入接入url.路径.请求方式和参数 (4)添加查看结果树 (5)调用接口.查看返回值

  8. C++何时使用引用

  9. mongodb(五)

    mongoDB 启动配置祥讲导出,导入,运行时备份Fsync锁,数据修复用户管理,安全认证 1.启动项 mongod --help 1.1利用config配置文件来启动数据库改变端口为8888 mon ...

  10. keepalived之vrrp_script详解

    通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup.当master出现异常后,backup自动切换为master.当backup成为master后,mast ...