iOS 8 中如何用 Swift 实现 Touch ID 验证

移动开发 iOS
iOS8开放了很多API,包括HomeKit、HealthKit什么的。我们这里要说的是其中之一的Touch ID验证。如题所述,这个项目使用Swift来实现的。如果你的swift不熟的话,需要略微补补脑哦。

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. var authButton: UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton 
  2. authButton.frame = CGRect(x: 100, y: screenHeight / 2, width: 100, height: 30) 
  3. 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. func addPassAction(sender:UIButton!){ 
  2.         println("add pass action"
  3.   
  4.         var laContext = LAContext() 
  5.         var authError : NSError? 
  6.         var errorReason = "keep things secret" 
  7.   
  8.         if laContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError){ 
  9.             laContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: errorReason, reply: { 
  10.                 (success, error) in 
  11.                 if success { 
  12.                     println("succeed"
  13.                 } 
  14.                 else
  15.                     println("failed"
  16.                 } 
  17.             }) 
  18.         } 
  19.         else
  20.             var alert = UIAlertView(title: "Can not do authenticatation", message: "", delegate: nil, cancelButtonTitle: "Cancel"
  21.         } 
  22.     } 

这里最重要的就是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的方法验证身份。就是看看能不能指纹解锁。没有硬件,或者有硬件没设定好指纹的都是不可以验证的。好的,如果已经设定好了指纹,那么就可以解锁了。

  1. laContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: errorReason, reply: { 
  2.  
  3.                 (success, error) in 
  4.  
  5.                 if success { 
  6.  
  7.                     println("succeed"
  8.  
  9.                 } 
  10.  
  11.                 else
  12.  
  13.                     println("failed"
  14.  
  15.                 } 
  16.  
  17.             }) 

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

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

责任编辑:闫佳明 来源: cnblogs
相关推荐

2014-10-15 10:09:12

iOS 8Touch ID开发

2021-07-27 07:15:11

苹果Touch IDiOS

2011-07-22 13:22:10

Java.NETDataTable

2022-07-08 07:02:10

Python动态码OTP

2011-09-05 13:53:08

Sencha Touc列表

2011-09-05 12:49:59

Sencha Touc事件

2018-12-04 14:46:03

苹果Face IDTouch ID

2011-03-15 09:10:47

iptablesNAT

2015-04-10 19:59:31

iOS8.3Touch ID

2011-03-15 14:26:23

iptablesNAT

2011-05-11 10:28:03

2011-09-05 13:48:36

Sencha Touc图标

2011-08-30 17:33:10

OracleSAS宏

2021-02-01 16:55:13

iPhoneTouch ID苹果

2011-07-22 13:23:56

IOS UI ScrollView

2020-05-09 10:38:31

Python透视表数据

2011-06-15 16:11:51

UIKitCocoa TouchiOS

2010-08-12 13:34:13

Flex验证组件

2009-03-24 13:04:55

汇总组织结构Oracle

2011-11-16 13:14:02

Sencha TouciOS本地应用
点赞
收藏

51CTO技术栈公众号