¿Cómo usar TouchID usando Swift?

La documentation que Apple ha proporcionado para la implementación de TouchID para iOS 8 está en Objective-C.

¿Hay una versión de Swift?

C objective:

- (IBAction)touchIDAvailable:(UIButton *)touchIDAvailableButton { LAContext *context = [[LAContext alloc] init]; __block NSString *msg; [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:NSLocalizedString(@"Place your finger on the sensor", nil) reply: ^(BOOL success, NSError *authenticationError) { if (success) { } } } 

Rápido:

 @IBAction func touchidbutton(sender: AnyObject) { authContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Place your finger on the sensor"?, reply: ((success : Bool, NSError!) -> Void)?){ if (success) { } } } 

Aquí está mi controller de vista que realiza estas comprobaciones en Swift. Mientras trabajaba en esto, encontré que la syntax de finalización del bloque / cierre en Swift era muy confusa.

Tenga en count que algunas de las opciones cambiaron en Beta 2 para darle más control sobre el cuadro de dialog Touch ID, como deshabilitar la opción de respaldo o el button de cancelar.

 // Imports import UIKit import LocalAuthentication // Class Implementation class FirstViewController: UIViewController { // Class Properties @IBOutlet var statusLabel : UILabel @IBOutlet var headerString: UILabel var authError : NSError? var authContext = LAContext() var statusText = "" var alert = UIAlertController(title: "", message: "", prefernetworkingStyle: UIAlertControllerStyle.Alert) // Class Methods @IBAction func swiftButtonPress(sender : AnyObject) { statusLabel.text = "Authenticating" //Can we use local auth? if authContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError) { authContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "I need to see if it's really you", reply: {(success: Bool, error: NSError!) -> Void in if success { self.statusText = "Touch ID success!" self.alert.title = "Success" self.alert.message = "I knew it was you!" } else { self.statusText = "Touch ID failed!" self.alert.title = "Failure" switch error!.code { case LAError.AuthenticationFailed.toRaw(): self.alert.message = "Authentication Failed" case LAError.UserCancel.toRaw(): self.alert.message = "User canceled!" case LAError.SystemCancel.toRaw(): self.alert.message = "The system canceled!" case LAError.UserFallback.toRaw(): self.alert.message = "User request to enter passcode" default: self.alert.message = "Something else went wrong" } } self.presentViewController(self.alert, animated: true, completion:{self.statusLabel.text = self.statusText}) }) } else { self.statusText = "No local authentication" alert.title = "Uh oh!" switch authError!.code { case LAError.TouchIDNotAvailable.toRaw(): alert.message = "No Touch ID on device" case LAError.TouchIDNotEnrolled.toRaw(): alert.message = "No fingers enrolled" case LAError.PasscodeNotSet.toRaw(): alert.message = "No passcode set" default: alert.message = "Something went wrong getting local auth" } self.presentViewController(self.alert, animated: true, completion: {self.statusLabel.text = self.statusText}) } resetTouchID() } // Reset the system so we can go again func resetTouchID() { authContext = LAContext() alert = UIAlertController(title: "", message: "", prefernetworkingStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil)) let passcodeDetector = SwiftPasscodeDetector() if passcodeDetector.checkForPasscode() { headerString.text = "Passcode Set on Device" } else { headerString.text = "No Passcode Set" } } // Inherited Methods override func viewDidLoad() { super.viewDidLoad() resetTouchID() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } 

}

El nombre de la API es LAContext , y está en los documentos aquí mismo . Es bastante escaso, pero cumple su function. El método que probablemente desee es

 evaluatePolicy(_ policy: LAPolicy, localizedReason localizedReason: String!, reply reply: ((Bool, NSError!) -> Void)!) 

El argumento de cadena es una subcabecera para mostrar al usuario, la respuesta es simplemente un bloque de callback, y la política actualmente tiene que ser LAPolicy.DeviceOwnerAuthenticationWithBiometrics , pero parece que el marco está ahí para otros types de authentication en el futuro. Interesante…

¡Espero que ayude! Lo intenté en mi teléfono porque tenía curiosidad y funciona maravillosamente. Solo asegúrese de consultar la capacidad de evaluar la política antes de intentar usarla, en caso de que esté en un dispositivo antiguo.

La reference LAContext tiene firmas de método tanto en Obj-C como en Swift. Además, si ⌘-clic en la class LAContext en su código Swift, debería poder ver el "encabezado" generado en Swift.

Actualizado a Swift 3

 static func authorizeWithTouchIDIfPossible(){ let authContext = LAContext() var authError : NSError? if authContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) { authContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "I need to see this", reply: { (success, error) in if success { print("Touch ID success!") DispatchQueue.main.async { //Do stuff here } } else { print("Touch ID failed!") }} ); } else { print("No local authentication") } } 

¡Lo encontré!

El siguiente enlace es de un usuario llamado Shmoopi de Github. Shmoopi hizo la aplicación para probar el TouchID progtwigdo en Swift.

https://github.com/Shmoopi/Swift-Touch-ID

Swift 3.0 en:

 import UIKit import LocalAuthentication class ViewController: UIViewController { @IBAction func TouchBtn(_ sender: AnyObject) { let context:LAContext = LAContext() if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error:nil) { context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason:"We Need Your Id", reply:{ (wasSuccessful,Error) in if wasSuccessful { print("Was a Sucess") } else { print("Not Logged In") } }) } } }