2014-11-20 3 views
4

TouchID를 사용하여 사용자가 내 앱에 로그인하는 데 도움이됩니다. 앱이 실행될 때마다 사용자가 제일 먼저 본 것은 TouchID 대화 상자입니다.TouchID 인증되었지만 대화 상자가 계속 표시됩니다.

내 문제는 손가락이 이미 홈 버튼에있는 상태에서 사용자가 앱을 실행하면 사용자가 즉시 인증되고 터치 ID 대화 상자 만 표시된다는 것입니다. 그렇다면 대화 (암호 입력 또는 취소)를 무시하기 위해 무엇을해도 회색 화면이 항상 내 앱 위에 있으며 작업을 계속하려면 iPhone을 다시 시작해야합니다.

어떻게 해결할 수 있습니까?

+1

나는 이것이 몇 가지 응용 프로그램에서 보았 기 때문에 OS의 버그라고 생각합니다. 레이더를 채우는 것 외에는 할 수있는 일이 많지 않습니다. – EmilioPelaez

+0

적어도 하나의 앱에서 해결 된 것을 보았습니다. 이 문제도 해결하고 싶습니다. – YogevSitton

+0

TouchId 코드를 viewDidLoad에서 viewDidAppear로 이동하여 앱에서이 문제를 해결했습니다. 타이밍이 중요하다고 생각합니다. – Daniel

답변

1

응용 프로그램 상태가 활성 일 때만 터치 ID 대화 상자를 표시하십시오. 실행 프로세스 중에 즉시 표시하면 (즉, 응용 프로그램이 여전히 기술적으로 비활성 상태 임), 이러한 종류의 문제가 발생할 수 있습니다. 이것은 문서화되어 있지 않으며, 이것이 어려운 것으로 나타났습니다.

예를 들어 응용 프로그램이 활성 상태 일 때 실행되도록하려면 현재 응용 프로그램 상태를 확인하고 즉시 실행하거나 applicationDidBecomeActive 알림을받을 수 있습니다. 당신이 터치 ID를 사용하는 경우

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

이 문제는 즉시 응용 프로그램 출시 후 발생 및 evaluatePolicy의 응답 블록에서 현재 뷰 컨트롤러 또는 창을 변경 : 예를 들어 아래를 참조 localizedReason : 응답 :.

터치 ID의 사용 가능 여부 확인 (canEvaluatePolicy : error :) 후 잠시 기다려주세요.

넣어 evaluatePolicy : localizedReason : 대답하십시오 dispatch_after 내부()이 같은 :

https://github.com/RungeZhai/TouchIDIssue

Aviram의 : 나는 샘플 프로젝트뿐만 아니라 여기에 솔루션을했습니다

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) { 

             } 
            } 
           }]; 
}); 

대답 (godmoney)도 잘 작동합니다.

+0

내 경험상 코드에 지연을 넣어야하는 경우 솔루션이 잘못된 문제를 해결하고 있습니다. (물론 애니메이션은 제외!) WDUK의 솔루션이 더 좋습니다. –

관련 문제