2014-06-28 4 views
5

Die Dokumentation, die Apple für die Implementierung von TouchID für iOS 8 bereitgestellt hat, befindet sich in Objective-C.Wie verwende ich TouchID mit Swift?

Gibt es eine Swift-Version davon?

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

Antwort

2

Die LAContext reference hat Methodensignaturen in sowohl Obj-C und Swift. Wenn Sie darüber hinaus in Ihrem Swift-Code auf die LAContext-Klasse klicken, sollten Sie in der Lage sein, den generierten "Header" dafür in Swift anzuzeigen.

2

Der API-Name lautet LAContext und befindet sich in der Dokumentation right here. Es ist ziemlich spärlich, aber es macht seine Arbeit. Die Methode möchten Sie wahrscheinlich

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

Das String-Argument ein subheader ist für den Benutzer angezeigt werden, ist die Antwort einfach ein Callback-Block, und die Politik hat derzeit LAPolicy.DeviceOwnerAuthenticationWithBiometrics sein, aber es scheint, der Rahmen ist für andere Arten der Authentifizierung in der Zukunft. Interessant ...

Hoffe, dass hilft! Ich habe es an meinem Handy versucht, weil ich neugierig war und es wunderbar funktioniert. Stellen Sie nur sicher, dass Sie nach der Möglichkeit gefragt werden, die Richtlinie auszuwerten, bevor Sie versuchen, sie zu verwenden, falls sie sich auf einem älteren Gerät befindet.

+0

Ich habe versucht, dass aber es gibt mir Fehler zu kompilieren. Können Sie mir Ihren evaluatePolicy-Zeilencode geben, der funktioniert? – user3785085

+0

@ user3785085 Es wäre besser, wenn Sie zur Verfügung gestellt, was Sie versucht haben, verursacht die Kompilierungsfehler. Nur nach Code von Leuten zu fragen, ist nicht cool. – Abizern

+0

Vereinbart mit @Abizern. Wir sind nicht hier, um Ihren Code für Sie zu schreiben. Nachdem das gesagt wurde, scheint die andere Person dir ihren Code geschrieben zu haben, also los gehts. Es ist wahrscheinlich die Closure-Block-Syntax, die dich durcheinander bringt. –

6

Hier ist mein View-Controller, der diese Prüfungen in Swift durchführt. Während ich daran arbeitete, fand ich die Completion Block/Closure-Syntax in Swift sehr verwirrend.

Beachten Sie, dass einige der Optionen in Beta 2 geändert wurden, um Ihnen mehr Kontrolle über den Touch ID-Dialog zu geben, z. B. Deaktivieren der Fallback-Option oder Abbrechen-Schaltfläche.

// 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

Wenn ich diesen Code versuche, gibt es mir einen Fehler, der ist "Der folgende Code stürzt mit dem Fehler ab" App aufgrund der nicht abgefangenen Ausnahme beenden "NSInvalidArgumentException" "Haben Sie dies zuvor mit diesem Code? – user3785085

+0

Ich habe diese nicht getroffen. Dies ist kein vollständiges Projekt, sondern nur ein View-Controller-Code, den Sie Ihren Bedürfnissen anpassen müssten.Es gibt auch mehrere vollständige Projekte auf GitHub – macshome

+0

Was ist das Äquivalent zu diesem 'LAError.UserFallback.toRaw()' in Objc ? – GoodSp33d

2

zu Swift 3

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

      }) 
     } 

    } 
} 
Verwandte Themen