2016-10-28 3 views
4

Ich bin ein nativer Touch-ID Warnung Code zu erstellen:becomeFirstResponder manchmal öffnet nicht die Tastatur auf ios 10

let context = LAContext() 

    guard deviceCanUseTouchId(context: context) else { 
     return 
    } 

    presentingAlert = true 
    [context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "touch_id_auth_message".localized(), reply: { [unowned self] success, error -> Void in 
     self.presentingAlert = false 
     self.canPresentAlert = true 

     dispatch_async(dispatch_get_main_queue()) {  
      completionHandler?(success) 
     } 
    })] 

Button Handler, der die native Touch-ID Alarm wie folgt aussieht ruft:

@IBAction func touchUpInsideUseTouchIdButton(sender: AnyObject) { 
    ACTouchId.sharedManager.authenticateWithTouchId(completionHandler: { [weak self] in 
     self?.handleTouchIdAuthentication(granted: $0) 
     }) 

    view.endEditing(true) 
} 

und dies ist der Code von handleTouchIdAuthentication:

private func handleTouchIdAuthentication(granted granted: Bool) { 
    if granted { 
     //... 
    } else { 
     passcodeDigitTextField1.becomeFirstResponder() 
    } 
} 

das Problem ist, dass die meisten Wenn ich den nativen Berührungsbildschirm-ID-Dialog abbricht, wird die Warnmeldung korrekt beendet und die Funktion "firstResponder()" funktioniert ordnungsgemäß.

Allerdings gibt turnFirstResponder() bei etwa 1 in 10 Fällen den Wert true zurück, passcodeDigitTextField1 erhält den Fokus, aber die Tastatur wird nicht angezeigt. Darüber hinaus wird die Tastatur nicht angezeigt, selbst wenn ich den Fokus auf ein anderes Textfeld ändere, indem ich auf sie tippe.

Strangly, funktioniert das gut für iOS 9 und 8. Das Problem tritt nur auf iOS 10.

+0

Kannst du das Stück im Hauptfaden tun? –

+0

Verwenden Sie einen Simulator oder ein tatsächliches Gerät? –

+0

Ich benutze das aktuelle Gerät mit iOS 10.0.2. – Dzior

Antwort

1

Können Sie versuchen, dies zu tun. Nicht sicher, es wird funktionieren!

+0

Ich habe mit klassischem GCD dispatch_async ausgeführt. Es hat nicht geholfen. Wir verwenden swift2 ATM – Dzior

+1

Nur ein Hack. Sie tun können, nur 'passcodeDigitTextField1.becomeFirstResponder()' in einer Funktion und diese Funktion aufrufen, mit einer Verzögerung von 0,25 oder 0,5 Sekunden perform verwenden und das Ergebnis sagen –

+0

0,25 scheint eine gute Arbeit zu haben, da ich nicht in der Lage war, dieses Problem zu reproduzieren mit diesem. Werde versuchen, diese Zahl am Mittwoch zu ändern, als die Ferien kamen. Es gibt ein weiteres Problem mit diesem. Auf iOS-10 im Gegensatz zu 9 und 8 dieser becomeFirstResponder auch ohne die 0,25 Verzögerung gelten Fokus auf die Steuerung nach 1 Sekunde, um die ein deutlich crappy User Experience ist, weitere 0,25 Sekunden es nicht besser machen:/ – Dzior

2

Wie Rajan erwähnt:

Nur ein Hack. Können Sie sich passcodeDigitTextField1.becomeFirstResponder() in einer Funktion tun und aufrufen, die von 0,25 oder 0,5 Sekunden mit einer Verzögerungsfunktion perform verwenden und das Ergebnis sagen -

Das funktionierte, landete ich mit 0,01 Verzögerung bis

Ich werde diese Antwort nicht markieren, da dies nur ein Workaround ist.

+0

Ich sah auch das gleiche Problem in iOS 10.2. Die Verwendung dieser Problemumgehung hat mein Problem irgendwie behoben. – Dalvik

2

Dies geschah jedes Mal in genau der gleichen Situation, in der ich versuchte, den Fokus nach einer fehlgeschlagenen Touch-ID-Authentifizierung zu setzen. Ich löste es, indem ich UIApplicationDidBecomeActiveNotification auf dem Standard NSNotificationCenter zeichne und meinen Anruf zu becomeFirstResponder innerhalb dieses setze.

ApplicationDidBecomeActive feuert leicht nach der Touch ID-Rückruf, der das Problem erklären könnte.

Es ist etwas peinlicher zu programmieren, aber es funktioniert bis jetzt 100% der Zeit. Viel besser als performSelector.

0

Es klingt vielleicht wirklich dumm, aber ... in meinem Fall half es einmal, das ganze Gerät neu zu starten. Nur das. Es war auch nur iOS 10. ;) Vielleicht gibt es jemanden mit einem ähnlichen Problem da draußen und habe das nicht versucht, bevor man den Stack-Überlauf überprüft, da es irgendwie merkwürdig erscheint, das Gerät für einen solchen Fehler neu zu starten.

Verwandte Themen