2016-04-19 11 views
0

Я хочу интегрировать TouchID в свое приложение. Основываясь на истинном отпечатке пальца, я позволю пользователю аутентифицироваться/не аутентифицироваться. Для этого, в viewWillAppear моего ViewController, я написал следующий код:Как подождать TouchID, пока он не закончится?

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

    } 
} 

}

Здесь authenticateWithFingerPrint делает основную работу и его код:

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; 

Однако, проблема заключается в том, что если блок метода viewWillAppear не ждет метода authenticateWithFingerPrint и возвращает false, это означает, что даже если пользователь входит в систему, она не будет аутентифицирована.

Итак, как сделать, если блок ожидает аутентификацииWithFingerPrint?

Спасибо :)

ответ

1

Вы не должны пытаться блокировать основной поток, пока вы ждете TouchID.

Вместо этого вам следует добавить новый ViewController перед тем, который вы пытаетесь заблокировать, и представить подсказку TouchID по этому экрану. При успешной аутентификации нажмите ViewController, на который вы ограничиваете доступ к стеку.