2014-11-20 4 views
4

Я использую TouchID, чтобы помочь пользователям войти в мое приложение. Когда приложение запускается, первое, что видит пользователь, это диалог TouchID.TouchID Authenticated, но диалог все еще отображается

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

Как я могу это решить?

+1

Я думаю, что это ошибка с ОС, потому что я видел ее в нескольких приложениях. Не так много вы можете сделать, кроме заполнения радара. – EmilioPelaez

+0

Я видел, как он был решен хотя бы в одном приложении. Я тоже хочу это решить :) – YogevSitton

+0

Я решил это в своем приложении, переместив мой TouchId-код из viewDidLoad в viewDidAppear. Я думаю, что время может быть важным. – Daniel

ответ

1

Убедитесь, что вы показываете только диалоговое окно Touch ID при активном состоянии приложения. Если вы отобразите его сразу во время запуска (это означает, что приложение по-прежнему технически находится в неактивном состоянии), тогда могут возникать такие проблемы. Это не документировано, и я нашел это трудным путем.

Например, чтобы убедиться, что он запущен, когда приложение активно, вы можете проверить текущее состояние приложения и немедленно запустить его или получить уведомление приложенияDidBecomeActive. Ниже для примера:

- (void)setup 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(applicationDidBecomeActive:) 
               name:UIApplicationDidBecomeActiveNotification 
               object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

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

    // We need to be in an active state for Touch ID to play nice 
    // If we're not, defer the presentation until we are 
    if([UIApplication sharedApplication].applicationState == UIApplicationStateActive) 
    { 
     [self presentTouchID]; 
    } 
    else 
    { 
     __weak __typeof(self) wSelf = self; 
     _onActiveBlock = ^{ 
      [wSelf presentTouchID]; 
     }; 
    } 
} 

-(void)applicationDidBecomeActive:(NSNotification *)notif 
{ 
    if(_onActiveBlock) 
    { 
     _onActiveBlock(); 
     _onActiveBlock = nil; 
    } 
} 

- (void)presentTouchID 
{ 
    _context = [[LAContext alloc] init]; 
    _context.localizedFallbackTitle = _fallbackTitle; 
    [_context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics 
      localizedReason:_reason 
         reply: ^(BOOL success, NSError *authenticationError) 
    { 
     // Handle response here 
    }]; 
} 
-1

Эта проблема возникает при использовании Touch ID сразу после запусков приложения и изменить текущий контроллер представления или окно в ответном блоке evaluatePolicy: localizedReason: ответ :.

Просто подождите некоторое время после проверки доступности (canEvaluatePolicy: ошибка :) идентификатора Touch.

Put evaluatePolicy: localizedReason: ответ: внутри dispatch_after(), как это:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics 
        localizedReason:NSLocalizedString(@"Use Touch ID to Unlock", nil) 
           reply:^(BOOL success, NSError *error) { 
            if (success) { 
            }else { 
             if (error.code == kLAErrorUserCancel) { 

             } 
            } 
           }]; 
}); 

Я сделал пример проекта, а также решение здесь:

https://github.com/RungeZhai/TouchIDIssue

Aviram-х Ответ (godmoney) также работает.

+0

В моем опыте, если вам нужно поместить задержку в свой код, ваше решение решает неправильную проблему. (за исключением анимации, конечно!) Решение WDUK лучше. –

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