Сбой приложения Touch ID

При попытке использовать TouchID в моем приложении он долго зависает, а затем иногда вылетает, а иногда, наконец, проходит. Я никогда ничего не пробовал с Touch ID, так что для меня это все в новинку. Мой код:

-(IBAction)touchID {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *student = [defaults objectForKey:@"firstName"];
    NSString *usingTouch = [defaults objectForKey:@"useTouchID"];

    if ([usingTouch isEqualToString:@"Yes"]) {
        [passwordfield removeFromSuperview];
        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) {
                                      NSLog(@"%@", error);
                                      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                                      message:@"There was a problem verifying your identity."
                                                                                     delegate:nil
                                                                            cancelButtonTitle:@"Ok"
                                                                            otherButtonTitles:nil];
                                      [alert show];
                                      return;
                                  }

                                  else if (success) {
                                      NSString *nope = @"Yes";
                                      [defaults setObject:nope forKey:@"firstName"];
                                      [defaults synchronize];
                                      [self updatetheview];

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

        }
        //Perform Touch ID Code
    }

}

Консоль показывает это снова и снова, прежде чем действовать так, как вы ожидаете:

 Stack:(
    0   CoreFoundation                      0x000000018359cf60  + 148
    1   libobjc.A.dylib                     0x0000000198a47f80 objc_exception_throw + 56
    2   CoreFoundation                      0x000000018359ce90  + 0
    3   Foundation                          0x00000001845bb2d8  + 88
    4   Foundation                          0x0000000184441a1c  + 56
    5   Foundation                          0x000000018443d5dc  + 260
    6   UIKit                               0x0000000188c378c4  + 64
    7   UIKit                               0x0000000188b2aa78  + 240
    8   UIKit                               0x0000000188b2a32c  + 116
    9   UIKit                               0x0000000188b2a1b8  + 504
    10  UIKit                               0x0000000188e3c834  + 228
    11  UIKit                               0x0000000188b28bf8  + 412
    12  Fritch                              0x0000000100186f40 -[DirectoryViewController updatetheview] + 180
    13  Fritch                              0x0000000100186cac __34-[DirectoryViewController touchID]_block_invoke + 316
    14  LocalAuthentication                 0x000000018599ee28  + 72
    15  LocalAuthentication                 0x000000018599e7e4  + 256
    16  LocalAuthentication                 0x000000018599b004  + 324
    17  LocalAuthentication                 0x000000018599b168  + 128
    18  CoreFoundation                      0x00000001835a2a70  + 144
    19  CoreFoundation                      0x00000001834a04d4  + 284
    20  Foundation                          0x00000001845c5b4c  + 20
    21  Foundation                          0x00000001845c5940  + 796
    22  Foundation                          0x00000001845c79c8  + 292
    23  libxpc.dylib                        0x00000001994a0c80  + 28
    24  libxpc.dylib                        0x00000001994a0c24  + 40
    25  libdispatch.dylib                   0x000000010051dc68 _dispatch_client_callout + 16
    26  libdispatch.dylib                   0x000000010052a780 _dispatch_queue_drain + 1036
    27  libdispatch.dylib                   0x0000000100521958 _dispatch_queue_invoke + 464
    28  libdispatch.dylib                   0x000000010051dc68 _dispatch_client_callout + 16
    29  libdispatch.dylib                   0x000000010052cec8 _dispatch_root_queue_drain + 2344
    30  libdispatch.dylib                   0x000000010052c590 _dispatch_worker_thread3 + 132
    31  libsystem_pthread.dylib             0x000000019946d470 _pthread_wqthread + 1092
    32  libsystem_pthread.dylib             0x000000019946d020 start_wqthread + 4
)

person user717452    schedule 28.10.2015    source источник


Ответы (1)


Блок reply из evaluatePolicy не вызывается в основном потоке. Вам нужно убедиться, что весь ваш UI-код в блоке reply выполняется в основном потоке.

person rmaddy    schedule 28.10.2015