2016-07-14 34 views
7

Ho la seguente implementazione di LocalAuthentication come descritto in molti posti.TouchID activateTouchWithResponse restituisce il successo senza richiedere l'impronta digitale

context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Logging in with Touch ID", reply: { (success : Bool, error : NSError?) -> Void in 
     dispatch_async(dispatch_get_main_queue(), { 

     if success { 
      let alert = UIAlertController(title: "Success", message: "", cancelButtonTitle: "Great!") 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 

     if let error = error { 
      var message :String 

      switch(error.code) { 
      case LAError..AuthenticationFailed: 
       message = "There was a problem verifying your identity." 
      case LAError..UserCancel: 
       message = "You pressed cancel." 
      case LAError..UserFallback: 
       message = "You pressed password." 
      default: 
       message = "Touch ID may not be configured" 
      } 

      let alert = UIAlertController(title: "Error", message: message, cancelButtonTitle: "Darn!") 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 
    }) 
}) 

Ma dopo che ho autenticato con successo con la mia impronta digitale, quindi evaluatePolicy (, localizedReason :, risposta :) restituisce successo senza richiedere per qualunque delle impronte digitali. In realtà sto abilitando o disabilitando TouchID con un UISwitch, quindi dopo la disattivazione e la riattivazione, desidero re-autenticare e immettere di nuovo l'impronta digitale.

Perché il caching è l'autenticazione?

Grazie

+0

aggiungere l'errore come un altro se e vedere cosa succede. – Konsy

+0

L'errore è nullo. La seconda volta che valuto la politica ottengo successo e errore nullo senza essere pronto a toccare il pulsante. –

+0

Prova a fare se error! = Nil invece – Konsy

risposta

14

LAContext, una volta valutato, tornerà il successo fino a quando è deallocata. È possibile invalidarlo manualmente e quindi l'errore restituito sarà LAError.InvalidContext.

Se si desidera ricevere una conferma TouchID ogni volta, è necessario creare un LAContext ogni volta. Ciò potrebbe essere realizzato

context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "Logging in with Touch ID", reply: { (success : Bool, error : NSError?) -> Void in 
     dispatch_async(dispatch_get_main_queue(), { 

     if success { 
      let alert = UIAlertController(title: "Success", message: "", cancelButtonTitle: "Great!") 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 

     if let error = error { 
      var message :String 

      switch(error.code) { 
      case LAError..AuthenticationFailed: 
       message = "There was a problem verifying your identity." 
      case LAError..UserCancel: 
       message = "You pressed cancel." 
      case LAError..UserFallback: 
       message = "You pressed password." 
      default: 
       message = "Touch ID may not be configured" 
      } 

      let alert = UIAlertController(title: "Error", message: message, cancelButtonTitle: "Darn!") 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 

     context = LAContext() 
    }) 
}) 
+0

Ottima risposta, ha chiarito la situazione, grazie. Non c'è alcuna parola in proposito nei documenti Apple, e la frase: "Non dare per scontato che una precedente valutazione delle politiche abbia esito positivo anche le valutazioni future. La valutazione delle politiche può fallire per vari motivi, incluso l'annullamento da parte dell'utente o il sistema." veramente confuso – Dren

3

Da ios 9 c'è touchIDAuthenticationAllowableReuseDuration per il contesto

La durata di autenticazione tocco ID reimpiego è ammissibile. Se il dispositivo è stato autenticato con successo tramite Touch ID nell'intervallo di tempo specificato, l'autenticazione per il ricevitore viene eseguita automaticamente, senza richiedere all'utente Touch ID. Il valore predefinito è 0, pertanto l'autenticazione Touch ID non può essere riutilizzata. La durata massima consentita per il riutilizzo dell'autenticazione tramite Touch ID è specificata dalla costante LATouchIDAuthenticationMaximumAllowableReuseDuration. Non è possibile specificare una durata più lunga impostando questa proprietà su un valore maggiore di questa costante. Disponibilità iOS (9.0 e successive), MacOS (10.12 e successivi)

se si imposta ad esempio per 60

context.touchIDAuthenticationAllowableReuseDuration = 60 

Sarà auto riuscirà senza verificare, se l'utente ha superato con successo il tocco verifica degli ID negli ultimi 60 secondi.

Quindi, è possibile impostare il valore che suite. Lo trovo molto buono ed è fastidioso chiedere all'utente di toccarlo di nuovo mentre lo ha fatto solo pochi secondi fa. (Per sbloccare lo schermo per esempio).

0

stavo affrontando lo stesso problema, ma poi ho aumentato il valore di durata, come di seguito:

context.touchIDAuthenticationAllowableReuseDuration = Double(5 * 60) // 5 min, 

Questa soluzione ha funzionato per me.

+0

Si potrebbe aver utilizzato la costante LATouchIDAuthenticationMaximumAllowableReuseDuration perché è l'intervallo di tempo consentito massimo. Il suo valore è solo 5 minuti. –