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. PyQt5对话框

    QinputDialog 输入的值可以是字符串,数字,或者一个项目从一个列表 def showDialog(self): text, ok = QInputDialog.getText(self, ' ...

  2. django-bower

    https://django-bower.readthedocs.io/en/latest/usage.html

  3. C++对象数组初始化

    类对象 数组 初始化可以使用构造函数初始化,同时类有不同的构造函数,可以对类对象数组元素使用不同的构造函数;

  4. Python小知识点(2)

    1.简述Python的运行过程 在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件. 我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器 ...

  5. CentOS7修改ssh端口

    http://www.cnblogs.com/rwxwsblog/p/5756894.html 修改/etc/ssh/sshd_config vi /etc/ssh/sshd_config #Port ...

  6. Java语言主要特点有哪些?

    1.简单 Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了.Java语言的简单性主要体现在以下三个方面: 1) Java的风格类似于C++,因而C++程序员是非常熟悉的.从某 ...

  7. JavaScript字符串转换日期

    JavaScript字符串转换日期 方法1:function strToDate(str){   var val=Date.parse(str);   var newDate=new Date(val ...

  8. 跟着太白老师学python day10 名称空间,作用域和取值顺序,变量的加载顺序

    名称空间分为3种: 1. 全局名称空间 2. 内置名称空间 3. 局部名称空间(临时) 作用域 全局作用域              1全局名称空间 2 内置名称空间 局部作用域           ...

  9. PHP - 闭包Closure和lambda function

    现在的语言没有闭包简直都不好意思说出来. 想要了解闭包是什么,那么就必须知道匿名函数.其实看起来他们其实差不多一个意思. 见php RFC一句话:   End of 2007 a patch was  ...

  10. linux下in命令

    1.用法 : ln [option] source_file dist_file -f 建立时,将同档案名删除.               -i 删除前进行询问.               ln ...