Можно ли при подсказке Touch ID сразу же предложить пользователю ввести пароль?

При использовании Touch ID/локальной аутентификации для разблокировки чего-либо, когда возможны как Touch ID, так и код-пароль, опция «Введите пароль» будет отображаться только после первой неудачной попытки Touch ID.

Можно сразу показать? Я предполагаю, что пользователь, не прошедший проверку подлинности для использования Touch ID на устройстве, попытается использовать приложение, и если он знает код доступа, это совершенно нормально использовать его, и они могут не попробовать свой отпечаток пальца, поскольку они знают, что это не добавлено.


person Doug Smith    schedule 08.05.2016    source источник
comment
вы нашли решение этого? С FaceID это еще (намного) раздражает...   -  person swalkner    schedule 18.01.2021
comment
Вы пытались удалить NSFaceIDUsageDescription из info.plist? В моих тестах это заставит iOS игнорировать faceid и немедленно отобразит диалоговое окно с паролем. Но только в том случае, если вы никогда раньше не разрешали faceid. Если вы это сделали, вам нужно удалить доступ к FaceID в настройках   -  person D. Mika    schedule 21.01.2021


Ответы (1)


Да, возможно Touch ID с паролем

  • Работает с Apple Face ID (iPhone X, Xs, XR, XsMax) и другими устройствами с Touch ID.
  • Предопределенная обработка ошибок при сбое распознавания.
  • Автоматическая аутентификация с паролем устройства при нескольких неудачных попытках.

Используйте аутентификацию Apple FaceID или TouchID в своем приложении с помощью BiometricAuthentication. Он очень прост и удобен в использовании, он обрабатывает аутентификацию Touch ID и Face ID на основе устройства.

Пожалуйста, проверьте этот пример: -

Доступны два варианта

  • .deviceOwnerAuthenticationWithBiometrics

  • устройствоВладелецАутентификация

    extension ViewController {
    
    func authenticationWithTouchID() {
     let localAuthenticationContext = LAContext()
     localAuthenticationContext.localizedFallbackTitle = "Use Passcode"
    
     var authError: NSError?
     let reasonString = "To access the secure data"
    
     if localAuthenticationContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
    
         localAuthenticationContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reasonString) { success, evaluateError in
    
             if success {
                 print("User authenticated successfully")
                 //TODO: User authenticated successfully, take appropriate action
    
             } else {
                 //TODO: User did not authenticate successfully, look at error and take appropriate action
                 guard let error = evaluateError else {
                     return
                 }
    
                 print(self.evaluateAuthenticationPolicyMessageForLA(errorCode: error._code))
    
                 //TODO: If you have choosen the 'Fallback authentication mechanism selected' (LAError.userFallback). Handle gracefully
    
             }
         }
     } else {
    
         guard let error = authError else {
             return
         }
         //TODO: Show appropriate alert if biometry/TouchID/FaceID is lockout or not enrolled
         print(self.evaluateAuthenticationPolicyMessageForLA(errorCode: error.code))
     }
    }
    
    func evaluatePolicyFailErrorMessageForLA(errorCode: Int) -> String {
     var message = ""
     if #available(iOS 11.0, macOS 10.13, *) {
         switch errorCode {
             case LAError.biometryNotAvailable.rawValue:
                 message = "Authentication could not start because the device does not support biometric authentication."
    
             case LAError.biometryLockout.rawValue:
                 message = "Authentication could not continue because the user has been locked out of biometric authentication, due to failing authentication too many times."
    
             case LAError.biometryNotEnrolled.rawValue:
                 message = "Authentication could not start because the user has not enrolled in biometric authentication."
    
             default:
                 message = "Did not find error code on LAError object"
         }
     } else {
         switch errorCode {
             case LAError.touchIDLockout.rawValue:
                 message = "Too many failed attempts."
    
             case LAError.touchIDNotAvailable.rawValue:
                 message = "TouchID is not available on the device"
    
             case LAError.touchIDNotEnrolled.rawValue:
                 message = "TouchID is not enrolled on the device"
    
             default:
                 message = "Did not find error code on LAError object"
         }
     }
    
     return message;
    }
    
    func evaluateAuthenticationPolicyMessageForLA(errorCode: Int) -> String {
    
     var message = ""
    
     switch errorCode {
    
     case LAError.authenticationFailed.rawValue:
         message = "The user failed to provide valid credentials"
    
     case LAError.appCancel.rawValue:
         message = "Authentication was cancelled by application"
    
     case LAError.invalidContext.rawValue:
         message = "The context is invalid"
    
     case LAError.notInteractive.rawValue:
         message = "Not interactive"
    
     case LAError.passcodeNotSet.rawValue:
         message = "Passcode is not set on the device"
    
     case LAError.systemCancel.rawValue:
         message = "Authentication was cancelled by the system"
    
     case LAError.userCancel.rawValue:
         message = "The user did cancel"
    
     case LAError.userFallback.rawValue:
         message = "The user chose to use the fallback"
    
     default:
         message = evaluatePolicyFailErrorMessageForLA(errorCode: errorCode)
     }
    
     return message
     }
    }
    

Примечание. Видео преобразовано в изображение в формате gif. Этот пример экрана ввода пароля на клавиатуре не отображается, потому что идет запись.

person Himanshu Patel    schedule 19.01.2021