2014-09-18 6 views
7

Ich habe daran gearbeitet, Touch ID-Unterstützung in eine App zu integrieren, an der ich gerade arbeite. Es ist jedoch sehr inkonsequent. Einer der häufigsten Fragen, die ich sehe ist auf einem neuen App-Start es wie erwartet funktioniert, aber dann auf die App Hintergrund versetzen, und es in den Vordergrund zu bringen Ich erhalte eine Fehlermeldung zurück voniOS 8 Touch ID-Fehler "Benutzerinteraktion ist erforderlich."

evaluatePolicy:localizedReason:reply: 

Es nicht einmal tut machen sehr viel Sinn

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

ich die touchid Alarm präsentiert haben versucht (ich nie die touchid Alarm sehen), wenn die Anwendung bereits ausgeführt wird, wenn seine nur im Vordergrund, scheint keine Rolle zu. Es ist jedes Mal nach dem ersten Start der App unterbrochen.

Wer sonst läuft in das?

Als Referenz hier ist der Code ich verwende:

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

bekommen dies auch. Wirklich anying – gallileo

+1

Ich erfahre den gleichen Fehler, aber in meinem Fall, auch wenn die App bereits aktiv und im Vordergrund ist. Ich arbeite an einem Framework, das von einer anderen App verwendet wird, aber mein Code funktioniert gut, wenn ich es in einem eigenständigen Projekt versuchte. Ich habe den Code in der ViewDidAppear des ursprünglichen View-Controller platziert, aber es führt immer zu einem Fehler. – schystz

+0

@schystz Ich habe das gleiche ... Ich schwöre es ist, nachdem ich meine Bündel-ID geändert habe .... Hast du eine Lösung gefunden? !! – maxisme

Antwort

7

Normalerweise Controller PIN Ansicht gedrückt werden, bevor im Hintergrund eingeben:

- (void)applicationDidEnterBackground:(UIApplication *)application 

So App innere Informationen werden nicht Erscheint beim Blättern durch App-Vorschaubilder (Home-Taste zweimal tippen). Ich nehme an, Sie machen etwas Ähnliches.

Das Problem ist, dass die neue API von LocalAuthentication erfordert, dass der aufrufende viewController sichtbar ist. Deshalb sollten Sie Ihre "showTouchID" -Funktion nicht aufrufen, bevor Sie in den Hintergrund treten. rufen Sie stattdessen "showTouchID" -Funktion, wenn Vordergrund eingeben:

- (void)applicationWillEnterForeground:(UIApplication *)application 

Und es sollte funktionieren. Vergessen Sie nicht, es auch beim ersten Start der App aufzurufen (in diesem Fall wird ..willEnterForeground nicht aufgerufen).

+0

Das ist mehr oder weniger was passiert ist. Am Ende habe ich den Begrüßungsbildschirm einfach in die Hauptfensteransicht des Hintergrunds verschoben (damit Sie den Inhalt nicht sehen können) und dann den PIN-Controller präsentiert, nachdem die App geöffnet wurde, und den Begrüßungsbildschirm entfernt. Funktioniert gut. –

3

@hethi Antwort hat mir wirklich geholfen, aber ich habe mehr dazu hinzuzufügen.

Grundsätzlich tritt dieser Fehler auf, wenn Ihre App vom Hintergrund und irgendwo auf Ihrem Code aufgeweckt wird, den Sie für Touch ID fragen (mein Fall ist der lokale Authentifizierungstyp, den ich mit dem Schlüsselbundtyp nicht getestet habe). Es besteht keine Möglichkeit, dass der Benutzer mit der Touch-ID interagiert, die während der Ausführung der App im Hintergrund angefordert wird, daher die Fehlermeldung.

Benutzerinteraktion ist erforderlich.

Die Gründe meiner App wurde aus Hintergrund kommen waren: Push Notifications oder Apple Watch.

Meine fix ist, etwas zu tun, wie dies auf der viewDidLoad Methode meiner ersten VC:

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

ich verwendet habe, != weil, wenn die App zuerst startet es im UIApplicationStateInactive Zustand befindet. Dieser Status erzeugt keinen Touch ID-Fehler, da die Eingabeaufforderung angezeigt wird.

Ich rufe auch [self promptForTouchID] auf eine Benachrichtigung von UIApplicationWillEnterForegroundNotification, aber da Sie wissen, dass die App in den Vordergrund eintritt, gibt es keine Notwendigkeit, hier zu überprüfen.