有没有办法在iOS模拟器上使用苹果的Touch ID(指纹扫描仪)?

我正在做一个应用程序,这将需要触摸身份validation,所以有什么办法,我可以在模拟器中使用触摸ID(指纹扫描仪)?

另外,请使用LocalAuthentication框架共享某种示例代码。

截至最新的testing版(6),模拟器上无法模拟指纹扫描。 说实话,我怀疑这将包括在后来的贝塔。

您将需要在设备上进行testing。

要使用身份validation框架,您需要:* XCode 6 * iOS 5的iPhone 5s

您需要执行的步骤是:

了解设备是否支持指纹validation以及指纹是否注册:

@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."); } 

仅validation指纹:

 [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); } }]; 

validation指纹或设备的密码取决于用户的select:这里有一些问题超出了问题的范围,请在以下urlfind更多信息: https//www.secsign.com/fingerprint-validation-as-an-alternative -to-通行码/

XCODE 7testing版支持在iPhone模拟器中testingTouch ID身份validation。您可以尝试这个testing。

[截图1]

[截图1]

[截图2]

[截图2]

在目标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. }); } } 

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