LAContext canEvaluatePolicy y Swift 2

Este es mi código en Swift:

if (LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics)) { return true; } 

Con Swift2, cambié mi código para que se vea así:

 if #available(iOS 8, *) { if (LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics)) { return true; } } 

Pero me sale el siguiente error:

La llamada puede lanzar, pero no está marcada con 'try' y el error no se maneja

¿Qué estoy haciendo mal?

Necesitas hacer algo como esto:

 do { try laContext.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics) // Call evaluatePolicy here } catch { print("Cannot evaluate policy, error: \(error)") } 

Todos los methods que devolvieron un Bool y tuvieron un inout NSError? ya que el último parámetro se convirtió automáticamente (Swift 2) para arrojar el error, por lo que se eliminó el parámetro. También el Bool era networkingundante porque era igual a si el inout NSError? es nulo

EDITAR: para get más información sobre el error, use esto dentro de la captura:

 switch LAError(rawValue: error.code)! { case .AuthenticationFailed: break case .UserCancel: break case .UserFallback: break case .SystemCancel: break case .PasscodeNotSet: break case .TouchIDNotEnrolled: break default: break } 

(Puede ver todos los posibles errores de CMD haciendo clic en LAError

EDIT: en XCode 7 beta 5/6 este método no arroja más, pero toma un NSErrorPointer como el último parámetro (al igual que el NSURL de checkResourceIsReachableAndReturnError por razones que no checkResourceIsReachableAndReturnError ). Sin embargo, puede ampliar su LAContext para hacer un método de lanzamiento como antes si lo desea:

 extension LAContext { func canEvaluatePolicyThrowing(policy: LAPolicy) throws { var error : NSError? canEvaluatePolicy(policy, error: &error) if let error = error { throw error } } } 

Prueba este código:

 do { try touchIDContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics) //Comprobar la repuesta de esa autentificacion touchIDContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: post, reply: { (success, ErrorType) -> Void in if success { // Autentificacion correcta alert.title = "Genial!" alert.message = "Te has autentificado correctamente" // Mostramos este Alerview self.presentViewController(alert, animated: true, completion: nil) } else { //AUTENTIFICACION FALLIDA //PASAMOS VALORES AL ALERTVIEW alert.title = "AUTENTIFICACION FALLIDA!!" //OFRECEMOS MAS INFORMACION SOBRE EL FALLO DE AUTENTIFICAICON switch ErrorType!.code { case LAError.UserCancel.rawValue: alert.message = "Usuario Cancela" case LAError.AuthenticationFailed.rawValue: alert.message = "Autentificacion Fallida!" case LAError.PasscodeNotSet.rawValue: alert.message = "Password no configurado" case LAError.SystemCancel.rawValue: alert.message = "Error de sistema" case LAError.UserFallback.rawValue:alert.message = "Usuario selecciona contrasen" default:alert.message = "Imposible Autentificarse" } //Mostramos el AlertView self.presentViewController(alert, animated: true, completion: nil) } }) // cierre del clousure } // cierre del do catch { print("Cannot evaluate policy, error: \(error)") } // cierre del catch 

Para Swift 3, hago esto:

 context.evaluatePolicy(policy, localizedReason: ...) { (success: Bool, error: Error?) in DispatchQueue.main.async { if success { ... } else if let error = error as? LAError { switch error.code { case LAError.authenticationFailed: ... } } } }