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!类型的success返回验证结果,成功活失败(true或false)。

好的。写个项目试试吧!

时间: 2024-08-10 10:44:41

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

Touch ID指纹解锁使用

Touch ID是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心密码被别人看到,另一方面也方便了自己的操作.iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验. 使用 Touch ID的API非常的简单也好理解,在使用前我们需要导入LocalAuthentication这个库.并引入关键模块:LAcontext 苹果公司并没有对Touch ID

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

Touch ID是iOS8上新公开的API,关于详细介绍和用法可以看CocoaChina的这两篇文章:上 和 下,在此篇文章中不在赘述. 我在app中需要的效果是如果touch id验证通过,则页面push到下一个viewController,否则本视图的数字密码输入框becomeFirstResponder.研究过touch id的人应该知道,这段代码大概会这么实现: 1 LAContext *context = [[LAContext alloc] init]; 2 NSError *err

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

对于Objective-C而言,只要几行代码即可搞定. 比如: #import <LocalAuthentication/LocalAuthentication.h> - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. LAContext *context = [[LAContext alloc] init]; if

iOS用户数据安全:Keychain、Touch ID以及1Password

使用登录界面来保护APP用户数据是很好的方法--你可以使用Keychain(内嵌在iOS里的)来确保用户数据的安全.不过苹果现在使用Touch ID提供了另外一层保护,该功能适用于iPhone5.iPhone6. iPhone 6+.iPad Air2以及iPad mini 3. 如果这些都还不够,可以尝试iOS 8引入的扩展,你甚至可以使用AgileBits开发的1Password app来整合登录信息的存储和获取.这一切都要感谢AgileBits团队开发者开源了他们的扩展包.这样你就可以把管

Touch ID和Passcode框架,Apple Watch风格的应用布局

本文转载至 http://www.cocoachina.com/ios/20141031/10110.html 水平滚动条(artwalk) 测试环境:Xcode 6.0,iOS 8.0 VENTouchLock Venmo app中使用的Touch ID和Passcode框架.VENTouchLock通过Touch ID指纹扫描或者Passcode来获得访问权限. 在iPhone上实现Apple Watch风格的应用布局 WatchSpringboard-Prototype是在iPhone上实

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

iPhone5S新增的指纹扫描识别传感器 Touch ID,黑客花了大量的时间表明指纹验证是可以被破解的.即使它可能被黑客攻击,对iPhone5S的安全性而言,仍然具有极大的好处. 为什么一个容易被破解的生物特征验证方法对iPhone5S的安全性具有极大的好处呢?抛开Touch ID本身的优势和弱点,它主要是增强密码保护,并简化认证.从消费者的角度来看,Touch ID使许多消费者都懒得输入密码,但是使用Touch ID需同时设置一个密码.有一些安全总比没有安全要好些,Touch ID鼓励人们使

iOS 8使用Touch ID进行用户认证

iOS 8的SDK开放了Touch ID的接口.从WWDC的视频中可以看到Touch ID应用在两个方面:用于Key Chain加密和用于授权.iOS 8正式版发布以后我们可以看到Evernote的iOS app已经集成了该功能.下面来看看如何实现使用Touch ID进行身份认证. 其实很简单,用于身份认证的所有的接口都在LocalAuthentication framework中, 该framework实际上只有三个头文件: LAContext.h LAError.h LAPublicDefi

iOS 中 Touch ID得使用方法

iPhone 5S公布以后,iOS设备基本都有集成Touch ID.而这个功能对自己的App也是一个非常好的扩展,关于Touch ID的使用方法.大致例如以下, Swift: 引入LocalAuthentication.framework import LocalAuthentication var myContext = LAContext() var error: NSError? var localizedReasonString = "认证提示信息" if myContext.

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

苹果公司在 iPhone 5s 的发布会上公布了全新的指纹识别安全技术,也就是 Touch ID,开创了生物安全识别技术在便携设备上使用的新篇章.此后,苹果还将此技术带到了 iPad 上.此前没有任何厂家将指纹识别成功的打造在如此常用的设备上,因为涉及到非常复杂的工艺和技术难关.苹果在2012年收购在此方面技术领先的 Authen Tec 公司作为技术基础,并为iOS设备量身打造了 Touch ID.这使得苹果在智能设备的指纹识别方面比其他厂商更加智能且利于使用.三星的指纹识别功能必须要用手指按