2014-09-18 5 views
7

Я работаю над интеграцией поддержки Touch ID в приложение, над которым я работаю. Однако он действует очень несовместимо. Одной из наиболее распространенных проблем, которые я вижу на свежий запуске приложения оно работает, как ожидалось, но затем на фоновом режиме приложения, и приведение его на передний план я получаю сообщение об ошибке назад отОшибка IOS 8 Touch ID «Требуется взаимодействие с пользователем».

evaluatePolicy:localizedReason:reply: 

Это не даже сделать много смысла (я никогда не видел предупреждения touchid)

Error Domain=com.apple.LocalAuthentication Code=-1004 "User interaction is required." UserInfo=0x171470a00 {NSLocalizedDescription=User interaction is required.} 

Я попытался представления предупреждение touchid, когда приложение уже запущено, когда его только на передний план, кажется, не имеет значения. Его сломал каждый раз после первого запуска приложения.

Кто-нибудь еще сталкивается с этим?

Для справки, вот код, я использую:

if (_useTouchId && [LAContext class]) { 
    LAContext *myContext = [[LAContext alloc] init]; 
    NSError *authError = nil; 

    if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { 
     _didPresentTouchId = YES; 
     [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Use your Touch ID to open *****" reply:^(BOOL success, NSError *error) { 
      dispatch_async(dispatch_get_main_queue(),^{ 
       if (success) { 
        _isClosing = YES; 

        [self hide]; 
        if (_successBlock) { 
         _successBlock(); 
        } 
       } 
       else if (error && error.code != -2 && error.code != -3 && error.code != -1004) { 
        [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Authentication failed, please enter your Pin" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] show]; 
       } 
       else { 
        if (error) { 
         DDLogError(@"TouchID error: %@", error.description); 
        } 

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .6 * NSEC_PER_SEC), dispatch_get_main_queue(),^{ 
         [self keyboardButtonTouched]; 
        }); 
       } 
      }); 
     }]; 
    } 
} 
+0

получение этого тоже. Действительно анонимный – gallileo

+1

У меня такая же ошибка, но в моем случае, даже когда приложение уже активно и на переднем плане. Я работаю над фреймворком, который используется другим приложением, но мой код отлично работает, когда я пробовал его в автономном проекте. У меня есть код, размещенный в viewDidAppear исходного контроллера, но он всегда приводит к ошибке. – schystz

+0

@schystz У меня такое же ... Клянусь, это после того, как я сменил идентификатор пакета ... Вы нашли решение? !! – maxisme

ответ

7

Обычно PIN вид контроллеры выталкиваются перед входом фона в:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Так внутренняя информация приложения не будет появляются при подкачке через изображения предварительного просмотра приложения (кнопка «два раза»). Я думаю, вы делаете что-то подобное.

Проблема заключается в том, что для нового API LocalAuthentication требуется, чтобы вызывающий viewController был видимым. Вот почему вы не должны называть свою функцию «showTouchID» перед тем, как уйти в фоновый режим. Вместо того, чтобы вызвать функцию "showTouchID" при вводе переднего плана:

- (void)applicationWillEnterForeground:(UIApplication *)application 

И он должен работать. Не забудьте вызвать его и при первом запуске приложения (в этом случае ..willEnterForeground не будет вызван).

+0

Это более или менее то, что происходило. Я закончил тем, что просто запустил заставку в основное окно на фоне (так что вы не можете видеть содержимое), а затем представив ПИН-контроллер после открытия приложения и удаления заставки. Работает хорошо. –

3

Ответ @hetzi действительно помог мне, но у меня есть еще что добавить.

В основном эта ошибка возникает, когда ваше приложение пробуждается из фона и где-то на вашем коде вы запрашиваете Touch ID (мой случай - это локальный тип проверки подлинности, я не тестировал его с типом keychain). Пользователь не может взаимодействовать с сенсорным идентификатором, когда приложение работает на фоне, поэтому сообщение об ошибке.

Требуется взаимодействие с пользователем.

Причины мое приложение доносился из фона были: Push-уведомления или Apple, часы.

Мой фикс делает что-то вроде этого на viewDidLoad метод моего исходного VC:

if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { 
    [self promptForTouchID]; 
} 

Я использовал !=, потому что, когда ваше приложение запускает первый находится в UIApplicationStateInactive состоянии. И это состояние не генерирует ошибку Touch ID, потому что появится приглашение.

Я также звоню [self promptForTouchID] по уведомлению UIApplicationWillEnterForegroundNotification, но так как вы знаете, что приложение войдет на передний план, нет необходимости здесь проверять.

Смежные вопросы