Ошибка Touch ID iOS 8 Требуется вмешательство пользователя.

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

evaluatePolicy:localizedReason:reply:

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

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

person Stephen Bradley    schedule 18.09.2014    source источник
comment
получить и это. действительно раздражает   -  person gallileo    schedule 02.10.2014
comment
Я испытываю ту же ошибку, но в моем случае, даже когда приложение уже активно и находится на переднем плане. Я работаю над фреймворком, который используется другим приложением, но мой код работает нормально, когда я пробовал его в автономном проекте. У меня есть код, помещенный в viewDidAppear начального контроллера представления, но он всегда приводит к ошибке.   -  person schystz    schedule 16.02.2015
comment
@schystz У меня то же самое ... Клянусь, это после того, как я изменил идентификатор своего пакета .... Вы нашли решение?!!   -  person maxisme    schedule 07.09.2015
comment
@Maximilian Насколько я помню, ошибка была где-то еще в моем коде. Это была проблема времени, дважды проверьте и убедитесь, что вы запускаете блок кода в основном потоке и когда приложение находится в активном состоянии. В конце концов, я поместил код в viewDidAppear.   -  person schystz    schedule 08.09.2015


Ответы (2)


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

- (void)applicationDidEnterBackground:(UIApplication *)application

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

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

- (void)applicationWillEnterForeground:(UIApplication *)application

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

person HeTzi    schedule 19.10.2014
comment
Примерно так и происходило. В итоге я просто поместил заставку в вид основных окон в фоновом режиме (чтобы вы не могли видеть содержимое), а затем представил PIN-контроллер после открытия приложения и удалил заставку. Работает хорошо. - person Stephen Bradley; 24.10.2014

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

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

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

Причины, по которым мое приложение появлялось в фоновом режиме: Push-уведомления или Apple Watch.

Мое исправление делает что-то подобное в методе viewDidLoad моего исходного VC:

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

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

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

person Lucien    schedule 22.06.2015