2016-04-19 9 views
0

Ich möchte TouchID in meine Anwendung integrieren. Basierend auf einem echten Fingerabdruck lasse ich den Benutzer authentifizieren/nicht authentifizieren. Um dies zu tun, in viewWillAppear meines Viewcontroller, ich habe den folgenden Code geschrieben:Wie warte ich auf TouchID bis zum Ende?

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 

if ([AppConfig getSettingWithKey:APP_TOKEN_KEY] != nil){ 

    if ([AppConfig getIsTouchIDPreferred] == PREFERRED){ 

     BOOL shouldAuthenticate: [MyTouchIDClass authenticateWithFingerPrint]; 
     if (shouldAuthenticate == YES){ 
      //normal flow 
     } 

    } 
} 

}

Hier tut authenticateWithFingerPrint die Hauptaufgabe und seinen Code:

LAContext *context = [[LAContext alloc] init]; 
NSError *error = nil; 

__block BOOL toBeReturned = NO; 
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){ 
           toBeReturned = YES; 
           return; 


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

return toBeReturned; 

jedoch Problem Dies ist der Fall, wenn block in der viewWillAppear-Methode nicht auf die authenticateWithFingerPrint-Methode wartet und false zurückgibt, was bedeutet, dass sie selbst dann nicht authentifiziert wird, wenn sich ein Benutzer anmeldet.

Also, wie zu machen, wenn Block auf authenticateWithFingerPrint-Methode warten?

Thanks :)

Antwort

1

Sie sollten den Haupt-Thread nicht versuchen, blockieren, während Sie für TouchID warten.

Was Sie wahrscheinlich tun sollten, ist stattdessen einen neuen ViewController vor dem, den Sie versuchen, den Zugang zu blockieren und den TouchID Prompt über diesen Bildschirm zu präsentieren. Wenn Sie erfolgreich authentifiziert wurden, drücken Sie den ViewController, auf den Sie den Zugriff beschränken, auf den Stapel.