Swift实现Touch ID验证
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验证的更多相关文章
- Touch ID指纹解锁使用
Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心密码被别人看到,另 ...
- 解决使用Touch ID API在回调时界面“长时间卡住”的问题
Touch ID是iOS8上新公开的API,关于详细介绍和用法可以看CocoaChina的这两篇文章:上 和 下,在此篇文章中不再赘述. 我在app中需要的效果是如果touch id验证通过,则页面p ...
- iOS Touch Id 开发
Touch Id Touch Id是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心 ...
- iOS8.0如何使用Touch ID来做验证
对于Objective-C而言,只要几行代码即可搞定. 比如: #import <LocalAuthentication/LocalAuthentication.h> - (void)vi ...
- Touch ID 实现
Touch ID 1.要求 机型:iPhone 5s以上 系统:iOS8以上 框架:#import <LocalAuthentication/LocalAuthentication.h> ...
- Touch ID使用
前言:如果图片看不了请移步:简书 Touch ID简介 Touch ID指纹识别作为iPhone 5s上的"杀手级"功能早已为人们所熟知,目前搭载的设备有iphone SE.iPh ...
- 微信将推指纹支付 "指付通"会与Touch ID整合吗
有消息称微信下一版本将推指纹支付“指付通”,解决手机丢失资金安全的问题(这个应该是针对阿里手机支付的弱点),到时候用户绑定的银行卡进行付款时,不用输入密码只需在专门的支付设备(苹果Touch ID ? ...
- iOS 使用Touch ID 校验[新增 iOS9 三种错误]
iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验.开发者们可使用向第三方应用开放了Touch ID权限的API,以便他们在应用中使用指纹认证来完成用户认证或支付购 ...
- 苹果5S指纹扫描识别传感器Touch ID有利于iPhone的安全性
iPhone5S新增的指纹扫描识别传感器 Touch ID,黑客花了大量的时间表明指纹验证是可以被破解的.即使它可能被黑客攻击,对iPhone5S的安全性而言,仍然具有极大的好处. 为什么一个容易被破 ...
随机推荐
- 【UVa】1600 Patrol Robot(dfs)
题目 题目 分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T 代码 #include <cstdio> #include <cstring> #inc ...
- oracle监听动态注册与静态注册
client端如果想要连接到远程的数据库服务器,首先数据库服务器必须启动监听器 oracle监听器的配置在$ORACLE_HOME/network/admin/listener.ora,打开这个文件, ...
- 【Java】编程
3.Java I/O流输入输出,序列化,NIO,NIO.2 https://www.cnblogs.com/jiangwz/p/9193776.html 4.JAVA调用WCF(转) https:// ...
- 3.docker学习之docker与虚拟化
虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 ...
- gif屏幕录像软件
ScreenToGif:http://screentogif.codeplex.com 备份下载地址:http://flask.pub/screentogif2.zip 本站连接:http ...
- django之中间件设置
中间件 是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中 每个中间件 ...
- from 组件
知识补充 : location.href="/index/" 加路径或者网址都可以 location.h ...
- 「小程序JAVA实战」小程序的flex布局(22)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-22/ 之前已经把小程序的框架说完了,接下来说说小程序的组件,在说组件之前,先说说布局吧.源码:ht ...
- Delphi 三层框架开发 服务端开发
采用Delphi7+SQL2008 一.创建数据库和表 CREATE TABLE [dbo].[tb_Department]( [FKey] [uniqueidentifier] NOT NULL, ...
- springmvc jpa
昨天帮同学搭建了一个springmvc+jpa+beetl模板引擎的项目环境,供参考. https://files.cnblogs.com/files/startnow/lntu-demo.zip 数 ...