2014-06-28 20 views
5

La documentazione fornita da Apple per l'implementazione TouchID per iOS 8 è in Objective-C.Come utilizzare TouchID utilizzando Swift?

Esiste una versione Swift di questo?

Objective-C:

- (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) { 
     } 
    } 
} 

Swift:

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

risposta

2

Il LAContext reference ha metodo firme sia in Obj-C e Swift. Inoltre, se fai ⌘-clic sulla classe LAContext nel tuo codice Swift, dovresti essere in grado di visualizzare l'intestazione generata per esso in Swift.

2

Il nome dell'API è LAContext ed è nei documenti right here. È piuttosto scarso, ma fa il suo lavoro. Il metodo che probabilmente si desidera è

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

L'argomento stringa è un subheader per visualizzare per l'utente, la risposta è semplicemente un blocco di richiamata, e la politica deve attualmente essere LAPolicy.DeviceOwnerAuthenticationWithBiometrics, ma sembra che il quadro è lì per altri tipi di autenticazione in futuro. Interessante ...

Spero che ti aiuti! Ho provato sul mio telefono perché ero curioso e funziona meravigliosamente. Assicurati di richiedere la possibilità di valutare la politica prima di provare a utilizzarla, nel caso in cui si trovi su un dispositivo precedente.

+0

Ho provato quello ma mi sta dando errori di compilazione. Puoi darmi il tuo codice di valutazione che funziona? – user3785085

+0

@ user3785085 Sarebbe meglio se tu fornissi quello che hai provato causando gli errori di compilazione. Chiedere semplicemente il codice alle persone non è bello. – Abizern

+0

Concordato con @Abizern. Non siamo qui per scrivere il tuo codice per te. Detto questo, l'altra persona sembra averti scritto il loro codice, quindi eccoti. Probabilmente è la sintassi del blocco di chiusura che ti incasina. –

6

Ecco il mio controller di visualizzazione che esegue questi controlli in Swift. Lavorando su questo ho trovato la sintassi di blocco/chiusura di completamento in Swift per essere molto confusa.

Si noti che alcune delle opzioni sono state modificate in Beta 2 per consentire un maggiore controllo sulla finestra di dialogo Touch ID, ad esempio la disattivazione dell'opzione fallback o del pulsante Annulla.

// 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: "", preferredStyle: 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: "", preferredStyle: 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. 
} 

}

+0

Quando provo questo codice mi dà un errore che è "Il codice sottostante si blocca con l'errore" Termina l'applicazione a causa dell'eccezione non rilevata "NSInvalidArgumentException" "Hai riscontrato questo prima con questo codice? – user3785085

+0

Non ho colpito quello no. Questo non è un progetto completo ma solo un codice del controller della vista, dovresti adottarlo in base alle tue esigenze. Esistono anche diversi progetti completi su GitHub. – macshome

+0

Qual è l'equivalente di questo 'LAError.UserFallback.toRaw()' in Objc ? – GoodSp33d

2

aggiornato per 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") 
     } 
    } 
0

Swift 3.0 in:

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") 
       } 

      }) 
     } 

    } 
} 
Problemi correlati