Is there any way to use apple's Touch ID (fingerprint scanner) on iOS Simulator?

后端 未结 3 1531
隐瞒了意图╮
隐瞒了意图╮ 2021-02-18 20:08

I am working on an app which would require Touch ID Authentication, so is there any way i can use Touch ID (fingerprint scanner) in the simulator ?

Also, please do share

相关标签:
3条回答
  • 2021-02-18 20:26

    As of Xcode 7 the Simulator supports 'touchID'. Answer below contains further info.

    As of the latest beta (6) there is no way to simulate a fingerprint scan on the simulator. To be honest I doubt this will be included even in later betas.

    You will need to test on device.

    To use the Authentication framework right now you need: * XCode 6 * iPhone 5s with iOS 8

    The steps you need to perform are:

    Find out whether the device supports fingerprint validation and whether a fingerprint is enrolled:

    @import LocalAuthentication;
    
    // Get the local authentication context:
    LAContext *context = [[LAContext alloc] init];
    
    // Test if fingerprint authentication is available on the device and a fingerprint has been enrolled.
    if ([context canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil])
    {
        NSLog(@"Fingerprint authentication available.");
    }
    

    Validate a fingerprint only:

    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Authenticate for server login" reply:^(BOOL success, NSError *authenticationError){
        if (success) {
            NSLog(@"Fingerprint validated.");
        }
        else {
            NSLog(@"Fingerprint validation failed: %@.", authenticationError.localizedDescription);
        }
    }];
    

    Validate a fingerprint or the device’s passcode depending on the user’s choice: This is a little beyond the scope of a question here, please find more information at: https://www.secsign.com/fingerprint-validation-as-an-alternative-to-passcodes/

    0 讨论(0)
  • 2021-02-18 20:36

    XCODE 7 beta supports testing the Touch ID Authentication in iPhone Simulator.You can try this for your testing.

    [Screenshot 1]

    [Screenshot 1]

    [Screenshot 2]

    [Screenshot 2]

    0 讨论(0)
  • 2021-02-18 20:43

    In Objective c

    @import LocalAuthentication;
    
    @interface EnterPasscodeVC ()
    
    
    -(void)viewWillAppear:(BOOL)animated {
        LAContext *myContext = [[LAContext alloc] init];
        NSError *authError = nil;
        NSString *myLocalizedReasonString =  @"Authentication is required to access your QPay Apps.";
    
        if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
            [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                      localizedReason:myLocalizedReasonString
                                reply:^(BOOL success, NSError *error) {
                                    if (success) {
                                        dispatch_async(dispatch_get_main_queue(), ^{
                                            [self performSegueWithIdentifier:@"Success" sender:nil];
                                        });
                                    } else {
                                        dispatch_async(dispatch_get_main_queue(), ^{
    
                                            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                                                message:error.description
                                                                                               delegate:self
                                                                                      cancelButtonTitle:@"OK"
                                                                                      otherButtonTitles:nil, nil];
                                            [alertView show];
    
    
                                            switch (error.code) {
                                                case LAErrorAuthenticationFailed:
                                                    NSLog(@"Authentication Failed");
                                                    // Rather than show a UIAlert here, use the error to determine if you should push to a keypad for PIN entry.
    
                                                    break;
    
                                                case LAErrorUserCancel:
                                                    NSLog(@"User pressed Cancel button");
                                                    break;
    
                                                case LAErrorUserFallback:
                                                    NSLog(@"User pressed \"Enter Password\"");
                                                    break;
    
                                                default:
                                                    NSLog(@"Touch ID is not configured");
                                                    break;
                                            }
                                            NSLog(@"Authentication Fails");
    
    
    
    
                                        });
                                    }
                                }];
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                    message:authError.description
                                                                   delegate:self
                                                          cancelButtonTitle:@"OK"
                                                          otherButtonTitles:nil, nil];
                [alertView show];
                // Rather than show a UIAlert here, use the error to determine if you should push to a keypad for PIN entry.
            });
        }
    }
    

    In Swift

    import LocalAuthentication
    
    
       override func viewDidLoad() {
            super.viewDidLoad()
            authenticateUser()
        }
    
    
    
      // MARK: Method implementation
    
        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.
            let 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 {
                        // If authentication was successful then load the data.
                        NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                            self.loadData()
                        })
                    }
                    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")
                            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                                self.showPasswordAlert()
                            })
    
    
                        default:
                            print("Authentication failed")
                            NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                                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:
                    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)
    
                // Show the custom alert view to allow users to enter the password.
                showPasswordAlert()
            }
        }
    
    
        func showPasswordAlert() {
            let passwordAlert : UIAlertView = UIAlertView(title: "TouchIDDemo", message: "Please type your password", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "Okay")
            passwordAlert.alertViewStyle = UIAlertViewStyle.SecureTextInput
            passwordAlert.show()
        }
    
    
        func loadData(){
            if appDelegate.checkIfDataFileExists() {
                self.dataArray = NSMutableArray(contentsOfFile: appDelegate.getPathOfDataFile())
                self.tblNotes.reloadData()
            }
            else{
                print("File does not exist")
            }
        }
    
    
        // MARK: UIAlertViewDelegate method implementation
    
        func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
            if buttonIndex == 1 {
                if !alertView.textFieldAtIndex(0)!.text!.isEmpty {
                    if alertView.textFieldAtIndex(0)!.text == "appcoda" {
                        loadData()
                    }
                    else{
                        showPasswordAlert()
                    }
                }
                else{
                    showPasswordAlert()
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题