iOS8开放了很多API,包括HomeKit、HealthKit等。我们在这里谈论的是其中之一,TouchID身份验证。过去,应用程序用于保护用户的隐私内容,只能设置和输入密码。看到iPhone本身只能通过TouchID解锁方便酷炫,而自带的app却不行。真是令人担忧。现在我们也可以很酷了。当用户打开使用TouchID身份验证的应用程序查看内容时,他们只能将手指放在主页按钮上以验证其身份。应用程序中验证的指纹是用户在手机上的指纹。是的,您的应用不需要用户再次输入指纹进行验证。所以使用起来非常方便。但是你还得做其他的准备。就像解锁iPhone一样,输入密码是必不可少的。如果用户没有开启TouchID,我们的app不可能是盲的吧?如标题所述,该项目是使用Swift实现的。如果你不熟悉swift,你需要稍微刷新一下你的大脑。说了这么多,来看看效果吧。只需将拇指放在主页按钮上,它就会解锁。界面布局如下:这里通过点击按钮触发验证。点击Authenticate按钮后,会弹出第一张图片的验证提示。好的,让我们进入正题。首先创建一个项目。您可以使用任何您喜欢的名称。但是编程语言,这里需要选择Swift。现在xcode6.0.1号称全面支持swift。那我们直接上swift。如果不行,也可以通过Apple提供的机制调用已有的ObjC代码。总之五个字:这没什么。而swfit本来可以节省很多代码。项目中其他地方可以保持默认选择。也就是说,我们省了点麻烦,直接用storyboard就行了。虽然实际上没有可以省略的界面元素。..在创建的项目中,选择BuildPhases。在项目中引入LocalAuthentication的框架。转到此处设置项目。导入代码中引入的框架。importLocalAuthentication接下来创建一个按钮:varauthButton:UIButton=UIButton.buttonWithType(UIButtonType.System)asUIButtonauthButton.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指的是任何类类型的实例。Any是指任何类型的实例。例如,AnyObject数组可以存储类类型的任何实例。这些实例都是类类型,并且属于同一类型。Any的数组可以容纳任何类型的实例,并且这些数组成员的类型不一定相同。创建UIButton的代码与之前的OC方法没有太大区别。它只是被swift语法所取代。现在你有了一个按钮,是时候设置按钮点击事件的处理方法了。记得不要addTarget:authButton.addTarget(self,action:Selector("addPassAction:"),forControlEvents:UIControlEvents.TouchUpInside)先看addTarget的声明:funcaddTarget(target:AnyObject?,action:Selector,forControlEventscontrolEvents:UIControlEvents)相应的,在方法调用中,可以看到self是AnyObject的target,就不用多说了。下面的动作是一个Selector结构(struct)。我们在调用的时候初始化一个Selector结构。该参数也可以不初始化Selector结构,直接给出action字符串。这就涉及到自动类型转换的一个知识点。Selector构造器需要提供一个字符串作为参数,所以如果直接给一个字符串,编译器会直接用这个字符串作为参数来初始化一个Selector结构。在Selector的字符串内容中,***是一个冒号“:”,和ObjC的写法一样。冒号表示该方法只有一个参数。***是UIControlEvents的枚举类型。不用每次都在这里写那么长。然后,实现Selector:,localizedReason:errorReason,reply:{(success,error)inifsuccess{println("succeed")}else{println("failed")}})}else{varalert=UIAlertView(title:"Cannotdoauthentication",message:"",delegate:nil,cancelButtonTitle:"Cancel")}}这里最重要的是TouchID验证的功能。varlaContext=LAContext()使用类型推断。为变量初始化的实例是什么类型,变量自动推导为该类型。varauthError:NSError?类型推断和可选值。可选值是在类型后面加一个问号。指示此值可以是实例或nil。注意:swift中的nil和ObjC中的nil是两个不同的东西。ObjC的nil是引用类型的空值。Swift的nil表示这个变量没有值,不管是不是引用类型。varerrorReason="keepthingssecret"该字符串将显示在界面中。所以一定不能为空!laContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,error:&authError)检查设备是否可以使用生物识别方法来验证身份。看看能不能用指纹解锁。没有硬件,或者有硬件但没有设置指纹,是无法验证的。OK,如果设置了指纹,就可以解锁了。laContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,localizedReason:errorReason,reply:{(success,error)inifsuccess{println("succeed")}else{println("failed")}})之后的replay参数为空返回值关闭。这个闭包的参数是bool和NSError!闭包的一般形式是{(参数1,参数2)->返回值类型in//code}success返回验证结果,成功或失败(true或false)。此时根据验证成功或失败,替换println("succeed")或println("failed")语句,实现你需要实现的功能。例如进入应用的功能详情页等使用TouchID保护的信息。如果无法验证,请跳至密码验证部分。这样,用户在无法进行指纹验证的情况下,也可以通过输入密码的方式进入app的功能部分。就是这样。写一个项目试试吧!
