I Die neue touchID-API von ios-8 wurde meiner App hinzugefügt. Es funktioniert normalerweise wie erwartet, ABER beim Eingeben der App, während mein Finger bereits auf Home-Taste ist - API-Erfolg Rückruf wird aufgerufen, aber Pop-up erscheint immer noch auf dem Bildschirm. Nach dem Drücken von CANCEL UI reagiert nicht mehr.Touch-ID, die dazu führt, dass die App nicht mehr reagiert
Antwort
begegnete ich auch das gleiche Problem und die Lösung war, den Anruf an die Touch-ID-API unter Verwendung einer Warteschlange mit hoher Priorität sowie eine Verzögerung aufzurufen:
// Touch ID must be called with a high priority queue, otherwise it might fail.
// Also, a dispatch_after is required, otherwise we might receive "Pending UI mechanism already set."
dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.75 * NSEC_PER_SEC), highPriorityQueue, ^{
LAContext *context = [[LAContext alloc] init];
NSError *error = nil;
// Check if device supports TouchID
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
// TouchID supported, show it to user
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:@"Unlock Using Touch ID"
reply:^(BOOL success, NSError *error) {
if (success) {
// This action has to be on main thread and must be synchronous
dispatch_async(dispatch_get_main_queue(), ^{
...
});
}
else if (error) {
...
}
}];
}
});
Bei der Prüfung unserer App, fanden wir, eine Verzögerung von 750ms ist optimal, aber Ihre Laufleistung kann variieren.
Update (03/10/2015): Mehrere iOS-Entwickler, wie 1Password zum Beispiel, are reporting, die iOS 8.2 haben endlich dieses Problem behoben.
Diese akzeptierte Antwort behandelt nicht die zugrunde liegende Ursache des Problems: zweimaliges Aufrufen von evaluatePolicy(), das zweite Mal während des ersten Aufrufs. Die aktuelle Lösung funktioniert also nur manchmal mit Glück, da alles zeitlich abhängig ist.
Das Brute-Force, einfache Möglichkeit, das Problem zu umgehen, ist ein einfaches boolesches Flag, das verhindert, dass nachfolgende Aufrufe stattfinden, bis der erste Vorgang abgeschlossen ist.
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
if (NSClassFromString(@"LAContext") && ! delegate.touchIDInProgress) {
delegate.touchIDInProgress = YES;
LAContext *localAuthenticationContext = [[LAContext alloc] init];
__autoreleasing NSError *authenticationError;
if ([localAuthenticationContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authenticationError]) {
[localAuthenticationContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:kTouchIDReason reply:^(BOOL success, NSError *error) {
delegate.touchIDInProgress = NO;
if (success) {
...
} else {
...
}
}];
}
Ich habe gerade Ihre Lösung in unserer App implementiert und es hat nicht funktioniert - wir sind auf das gleiche Problem gestoßen, das bei @HeTzi aufgetreten ist. – Aviram
Versucht, es zu implementieren, hat nicht funktioniert. – gmaliar
Es scheint, das Problem ist nicht innerhalb der 'LAContext' wird zweimal aufgerufen. – gmaliar
Während die Verwendung einer Verzögerung möglicherweise das Problem beheben kann, maskiert es die Ursache. Sie müssen sicherstellen, dass das Touch ID-Dialogfeld nur angezeigt wird, wenn der Anwendungsstatus aktiv ist. Wenn Sie es während des Startvorgangs sofort anzeigen (was bedeutet, dass die Anwendung technisch noch in einem inaktiven Zustand ist), können diese Art von Anzeigeproblemen auftreten. Dies ist nicht dokumentiert, und ich fand das auf die harte Tour. Das Bereitstellen einer Verzögerung scheint es zu beheben, weil Ihre Anwendung bis dahin in einem aktiven Zustand ist, aber dies ist nicht garantiert.
Um sicherzustellen, dass es ausgeführt wird, wenn die Anwendung aktiv ist, können Sie den aktuellen Anwendungsstatus überprüfen und entweder sofort ausführen oder wenn wir die applicationDidBecomeActive-Benachrichtigung erhalten. Siehe unten für ein Beispiel:
- (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
}];
}
Dies ist eine viel bessere Antwort als die akzeptierte, weil diese Lösung keine lästige Verzögerung verursacht. Toller Fang, danke! Aber ich glaube immer noch, dass dieses Problem von Apple in SDK behoben werden sollte, da offensichtlich fast jede App an diesem Problem leidet. –
Ich verwende eine ähnliche Lösung, der Schlüssel war zu überprüfen/warten auf UIApplicationStateActive. Vielen Dank! – JOM
Ich habe angefangen, den "Pending UI-Mechanismus bereits eingestellt." Fehler auch erwähnt, so entschied ich mich zu sehen, ob andere Apps betroffen waren. Ich habe sowohl Dropbox als auch Mint für Touch ID eingerichtet. Sicher genug Touch ID funktionierte auch nicht für sie und sie fielen auf Passcodes zurück.
Ich habe mein Telefon neu gestartet und es hat wieder angefangen zu arbeiten, so dass es scheint, dass die Touch ID ausfällt und aufhört zu arbeiten. Ich bin auf iOS 8.2 BTW.
Ich denke, der richtige Weg, um diese Bedingung zu behandeln ist, wie diese Apps tun und Fallback auf Passwort/Passcode.
- 1. Warum führt eine Endlosschleife dazu, dass ein Programm nicht reagiert?
- 2. Modale Dialoge, die dazu führen, dass die Benutzeroberfläche nicht mehr reagiert
- 3. Das Ausführen von VBA-Skript führt dazu, dass Excel nicht mehr reagiert
- 4. Starker Datenverkehr auf dem Server führt dazu, dass die App geschlossen wird
- 5. Der Aufruf der PHP-Objektdatei führt dazu, dass die Seite nicht mehr geladen wird.
- 6. Plötzlich reagiert die iOS App überhaupt nicht mehr
- 7. Warum führt ein Nulldatum dazu, dass die Kreuztabellenfunktion fehlschlägt?
- 8. Führt die Zuweisung zu Nothing dazu, dass Dispose aufgerufen wird?
- 9. Bootstrap-Warnung führt dazu, dass Leerzeichen erscheinen
- 10. Netzwerkfehler, die dazu führen, dass die Landstreicher-Maschine nicht startet
- 11. Das Auslösen einer RuntimeException führt dazu, dass die Transaktion zurückgesetzt wird, die Ausnahme jedoch nicht in einer Springstart-App
- 12. Async-Postback führt nicht dazu, dass document.ready ausgeführt wird
- 13. die Seite reagiert nicht mehr, wenn die while-Schleife ist
- 14. PHP/HTML Zeile, die dazu führt, dass die Seite leer wird
- 15. Zurück-Taste bewirkt, dass Anwendung nicht mehr reagiert
- 16. Warum führt die Verwendung von threading.Event dazu, dass SIGTERM nicht abgefangen wird?
- 17. Ansichtsfensterbreite, die dazu führt, dass der Hintergrund nicht wie erwartet angezeigt wird
- 18. Die Behandlung von Fehlerereignissen führt dazu, dass Read nicht aufgerufen wird
- 19. Was würde dazu führen, dass die Zwischenspeicherung von Rails-Seiten nicht mehr funktioniert?
- 20. WebBrowser Control bewirkt, dass ganze Anwendung nicht mehr reagiert
- 21. Anwendung VB6 reagiert nicht mehr
- 22. Warum führt die Konsolenausgabe dazu, dass das selbstreferenzierende Stapelscript sauber beendet wird?
- 23. Python Spyder reagiert nicht mehr
- 24. Akka Http HTTPS-Konfiguration, die dazu führt, dass Chrome zurückkehrt ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- 25. Mehrere Grep-Rohrleitungen (include + exclude) führt dazu, dass nichts angezeigt
- 26. Welcher Hibernate FetchMode führt dazu, dass Sammlungen lazy-loaded werden?
- 27. Das Nachdenken über Baugruppen führt dazu, dass Unity Microsoft.Practices.ServiceLocation benötigt
- 28. VS2015 Entwurfsansicht reagiert nicht mehr
- 29. Was kann dazu führen, dass die Web.sitemap nicht gefunden wird?
- 30. Die Bereitstellung für Android führt dazu, dass die Datei nach dem Hinzufügen von QtQuick Controls nicht gefunden wird.
Arbeitete für mich :) Große Antwort, danke! – HeTzi
Verwenden von iOS 8.2 und haben das gleiche Problem. Sieht aus wie Problem ist noch nicht vollständig behoben. – JOM
@JOM Es scheint für mich auf iOS 8.2 ohne die 750ms Verzögerung zu arbeiten, aber Sie benötigen immer noch die Warteschlange mit hoher Priorität, wenn Sie es aufrufen. – Aviram