Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Touch ID for login iOS

I'm making an iOS application (Obj-c) with a login form. I'm trying to figure out if there is a way to use Touch ID to login. This will be an amazing feature for my app, but I can't find a way to do it. In the last PayPal update they include the Touch ID login - so there is a way to do it.

EDIT: I know how to get if the user enter the correct Touch ID, but I don't know what to do after that. What if the user enter his username and then add the Touch ID correctly? How could I know this user have this Touch ID?

like image 643
Stefo Avatar asked Jun 02 '15 11:06

Stefo


1 Answers

Okay first create an action like so:

We need more detail tough, as I do not know if you mean Obj-C or swift, I'll just post both.

Obj-C

Firstly import the local authentication framework

#import <LocalAuthentication/LocalAuthentication.h>

Then we create an IBAction and add the following code:

- (IBAction)authenticateButtonTapped:(id)sender {
   LAContext *context = [[LAContext alloc] init];

   NSError *error = nil;
   if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
       [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
               localizedReason:@"Are you the device owner?"
                         reply:^(BOOL success, NSError *error) {

           if (error) {
               UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                               message:@"There was a problem verifying your identity."
                                                              delegate:nil
                                                     cancelButtonTitle:@"Ok"
                                                     otherButtonTitles:nil];
               [alert show];
               return;
           }

           if (success) {
               UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Success"
                                                               message:@"You are the device owner!"
                                                              delegate:nil
                                                     cancelButtonTitle:@"Ok"
                                                     otherButtonTitles:nil];
               [alert show];

           } else {
               UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                               message:@"You are not the device owner."
                                                              delegate:nil
                                                     cancelButtonTitle:@"Ok"
                                                     otherButtonTitles:nil];
               [alert show];
           }

       }];

   } else {

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                       message:@"Your device cannot authenticate using TouchID."
                                                      delegate:nil
                                             cancelButtonTitle:@"Ok"
                                             otherButtonTitles:nil];
       [alert show];

   }
}

The just connect your IBAction to a button that will prompt authentication.

However in Swift you would use:

Add the following framework to your project: LocalAuthentication Then import it in your swift file:

import LocalAuthentication

Then create the following method that will prompt you to use touch id:

func authenticateUser() {
        // Get the local authentication context.
        let context = LAContext()

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

        // Set the reason string that will appear on the authentication alert.
        var reasonString = "Authentication is needed to access your notes."

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

                }
                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.
                    println(evalPolicyError?.localizedDescription)

                    switch evalPolicyError!.code {

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

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

                    case LAError.UserFallback.rawValue():
                        println("User selected to enter custom password")
                        self.showPasswordAlert()

                    default:
                        println("Authentication failed")
                        self.showPasswordAlert()
                    }
                }

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

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

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

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

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

            // Show the custom alert view to allow users to enter the password.
            self.showPasswordAlert()
        }
    }

Lastly from the func viewDidLoad call the function like so: authenticateUser()

Hope that helps. Keep coding.

Sources: Swift: App Coda iOS 8 Touch ID Api

Objective-C: tutPlus iOS Touch ID

Thanks to Matt Logan for the updated swift code.

like image 184
Julian E. Avatar answered Sep 30 '22 19:09

Julian E.