2016-05-06 35 views
0

我想基于触摸ID的成功/失败返回true或false。但是,如果条件被调用,那么成功的时候,该函数会以一个错误的值退出。我是iOS开发新手。我相信我应该使用某种完成处理程序,但在这个特定情况下,我不明白如何处理。成功触摸ID设置变量

func authenticateUser(reasonString: String) -> Bool { 
    // Get the local authentication context. 
    let context = LAContext() 

    // Declare a NSError variable. 
    var error: NSError? 

    // Current authorization status of user 
    var isAuthorized = false 

    // Check if the device can evaluate the policy. 
    if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error) { 
     [context .evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: { (success: Bool, evalPolicyError: NSError?) -> Void in 

      if success { 
       isAuthorized = true 
      } 
      else{ 
       // If authentication failed then show a message to the console with a short description. 
       // In case that the error is a user fallback, then show the password alert view. 
       print(evalPolicyError?.localizedDescription) 

       switch evalPolicyError!.code { 

       case LAError.SystemCancel.rawValue: 
        print("Authentication was cancelled by the system") 

       case LAError.UserCancel.rawValue: 
        print("Authentication was cancelled by the user") 

       case LAError.UserFallback.rawValue: 
        print("User selected to enter custom password") 

       default: 
        print("Authentication failed") 

       } 
      } 

     })] 
    } 
    else{ 
     // If the security policy cannot be evaluated then show a short message depending on the error. 
     switch error!.code{ 

     case LAError.TouchIDNotEnrolled.rawValue: 
      print("TouchID is not enrolled") 

     case LAError.PasscodeNotSet.rawValue: 
      print("A passcode has not been set") 

     default: 
      // The LAError.TouchIDNotAvailable case. 
      print("TouchID not available") 
     } 

     // Optionally the error description can be displayed on the console. 
     print(error?.localizedDescription) 

    } 
return isAuthorized 
} 

即使在执行touchID部件之前,此函数也会返回false。有人可以指导吗?

回答

0

您的函数authenticateUser将始终返回false,因为您返回的是isAuthority值,该值设置为false。 context.canEvaluatePolicy和context.evaluatePolicy仍在执行,值不会更改为isAuthorized。

实际流量是有点像这样:

集isAuthorized ==假

{调用context.canEvaluatePolicy - >仍在执行 呼叫context.evaluatePolicy - 对context.canEvaluatePolicy的成功>}

返回isAuthorized = False - > context.canEvaluatePolicy和context.evaluatePolicy仍在执行。

即使Block Methods正在执行,执行流程完成方法的执行。

我的建议是从函数的最后去掉return isAuthorized并实现成功和失败块。