LAContext可以评估策略和Swift 2
这是我在Swift中的代码:
if (LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics)) { return true; }
使用Swift2,我将代码更改为:
if #available(iOS 8, *) { if (LAContext().canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics)) { return true; } }
但是我收到以下错误:
调用可以抛出,但它没有标记为’try’,并且不处理错误
我究竟做错了什么?
你需要做这样的事情:
do { try laContext.canEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics) // Call evaluatePolicy here } catch { print("Cannot evaluate policy, error: \(error)") }
所有返回Bool
并且有一个inout NSError?
因为最后一个参数被自动转换(Swift 2)以抛出错误,所以参数被删除了。 Bool
也是多余的,因为它等于inout NSError?
没有
编辑:要获取有关错误的更多信息,请在catch中使用:
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 }
(您可以通过CMD点击LAError
来查看所有可能的错误
编辑:在XCode 7 beta 5/6中,此方法不再抛出,但是将NSErrorPointer
作为最后一个参数(因为NSURL
的checkResourceIsReachableAndReturnError
因为我不知道的原因)。 但是,如果您愿意,可以扩展您的LAContext
以像以前一样制作投掷方法:
extension LAContext { func canEvaluatePolicyThrowing(policy: LAPolicy) throws { var error : NSError? canEvaluatePolicy(policy, error: &error) if let error = error { throw error } } }
试试这段代码:
do { try touchIDContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics) //Comprobar la repuesta de esa autentificacion touchIDContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: mensaje, 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
对于Swift 3,我这样做:
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: ... } } } }