Touch ID против кода Face ID

Хотела задать вопрос о биометрической аутентификации. В своем приложении я ввел аутентификацию с помощью Touch ID. Теперь воэльво реализовать метод с Face ID.

Я вставил строку Конфиденциальность - Описание использования Face ID в свой файл .plist.

Теперь я заметил, что мой Face ID работает правильно, не внося никаких изменений в код TouchID.

У меня вопрос:

** Код реализации Touch ID идентичен таковому для Face ID? Могу ли я оставить код реализации Touch ID без каких-либо изменений или мне нужно добавить несколько строк кода для Face ID? **

Я покажу вам, как я реализовал свой Touch ID

#pragma mark - TOUCH ID Login
-(void)useTouchID {
    NSError *error;
    LAContext *context = [[LAContext alloc] init];

    NSString *emailAccount = [KFKeychain loadObjectForKey:USER_EMAIL];
    NSString *reasonString = [NSString stringWithFormat:@"Autentica %@ utilizzando la tua impronta", emailAccount];

    if ([context canEvaluatePolicy:kLAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        [context evaluatePolicy:kLAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason: reasonString reply:^(BOOL success, NSError * _Nullable error) {
            // Se la procedura con il TouchID va a buon fine settiamo il booleano su YES che specifica se l'utente a scelto di utilizzare il TouchID oppure NO.
            // Successivamente invochiamo il metodo loginWithFirebase per procedere con l'autenticazione su firebase

            dispatch_async(dispatch_get_main_queue(), ^{
                [APPDELEGATE showHud];
            });

            if (success) {
                _useBiometricsAuthentication = YES;
                // Attualmente il TouchID non viene supportato da Firebase pertanto dobbiamo autenticarci con l'impronta digitale e successivamente eseguire il login con Firebase.
                [self useFirebaseSignIn];
            }
            // Nel caso in cui si verifichino alcuni errori con l'uso del TouchID andiamo ad implementare ogni singolo errore che l'utente puo' riscontrare
            else {
                _useBiometricsAuthentication = NO;

                switch ([error code]) {
                        // L'autenticazione con Touch ID è fallità
                    case kLAErrorAuthenticationFailed:
                        NSLog(@"Autenticazione Fallita");
                        dispatch_async(dispatch_get_main_queue(), ^{
                            [APPDELEGATE removeHud];
                        });
                        break;
                        // L'user ha spinto annulla sull'alert che compare sulla richiesta di TouchID oppure ha spinto il pulsante Home facendo scomparire l'alert
                    case kLAErrorUserCancel:
                        NSLog(@"User ha respinto il touch ID");
                        dispatch_async(dispatch_get_main_queue(), ^{
                            [APPDELEGATE removeHud];
                        });
                        break;
                        // In questo caso l'user ha piu volte tentato di utilizzare il touchID e ha preferito inserire le proprie credenziali manualmente
                    case kLAErrorUserFallback:
                        NSLog(@"L'user ha scelto di utilizzare il login di firebase");
                        // a questo punto eliminiamo tutti i dati salvati con il login precedente in modo tale da poter salvare nuovamente le credenziali che l'utente ha inserito manualmente
                        [self deleteUserKey];
                        dispatch_async(dispatch_get_main_queue(), ^{
                            [APPDELEGATE removeHud];
                        });
                        break;
                        // L'errore ci comunica che l'utente molto probabilmente non ha mai inserito / salvato le proprie impronte digitali nel suo dispositivo
                    case kLAErrorTouchIDNotEnrolled:
                        NSLog(@" non sono state impostate impronte per utilizzare il touch id");
                        dispatch_async(dispatch_get_main_queue(), ^{
                            [APPDELEGATE showAlertWithTitle:@"ATTENZIONE" message:@"Il TUOCH ID ha bisogno di avere delle impronte digitali impostate per poter funzionare. Vai sulle IMPOSTAZIONI del tuo dispositivo in TOUCH ID e CODICE per inserirle" optionTitle:@"OK" otherOptionTitle:nil optionButtonAction:^{
                                [APPDELEGATE dismissAlert];
                            } canButtonAction:nil];
                            [APPDELEGATE removeHud];
                        });
                        break;
                        // In questo caso ci avverte che per utilizzare il TouchID l'app deve aver salvato almeno una volte le credenziali che l'utente inserisce manualmente, all'interno di un portachiavi come ad esempio la libreria utilizzata in questa app (Keychain)
                    case kLAErrorPasscodeNotSet: {
                        NSLog(@"il touch id ha bisogno di avere dei codici di accesso salvati per essere usato");
                        dispatch_async(dispatch_get_main_queue(), ^{
                            [APPDELEGATE showAlertWithTitle:@"ATTENZIONE" message:@"Sembra che non vi sia nessun account collegato a queste impronte. Perfavore effettua il login classico utilizzando la tua Email e la tua Password del tuo account Unistit e riprova." optionTitle:@"OK" otherOptionTitle:nil optionButtonAction:^{
                                [APPDELEGATE dismissAlert];
                                [self.emailField becomeFirstResponder];
                                [self deleteUserKey];
                            } canButtonAction:nil];
                            [APPDELEGATE removeHud];
                        });
                        break;
                    }
                    default:
                        break;
                }
            }
        }];
    }
}

person kAiN    schedule 15.02.2018    source источник


Ответы (2)


Вам не нужно обновлять код, чтобы быть готовым к Face ID, если ваше приложение уже поддерживает Touch ID. (как показано здесь) < img src = "https://i.stack.imgur.com/sCS8B.png" alt = "введите описание изображения здесь"> iOS берет на себя всю внутреннюю работу.

Однако вы можете изменить строки, содержащие «Touch ID», на «Face ID», если приложение работает на устройстве с поддержкой Face ID.

Изменить: как отметил MikeMertsock, LAContext есть свойство biometryType, определяющее, использует ли устройство Touch ID или Face ID.

person Quentin Hayot    schedule 15.02.2018
comment
Стоит отметить, что класс LAContext имеет свойство biometryType для определения того, устройство использует Touch ID или Face ID. - person Mike Mertsock; 15.02.2018
comment
@MikeMertsock, абсолютно! - person Quentin Hayot; 15.02.2018
comment
@QuentinHayot Прекрасно, спасибо, ребята ... Я могу спросить, можете ли вы показать мне небольшой пример кода, чтобы понять, как реализовать, поддерживает ли устройство Face ID? - person kAiN; 15.02.2018
comment
На это был дан ответ здесь: stackoverflow.com/questions/46887547/ - person Quentin Hayot; 15.02.2018
comment
@perfect Tnx, ребята - person kAiN; 15.02.2018

Возможно, вы ищете это: biometryType используется для указания / обновления некоторых локализуемых файлов только для информации пользователя. Ваш рабочий код будет автоматически определять biometryType и обрабатывать операции аутентификации. Вам не нужно его обновлять.

Вот пример кода, как вы можете вручную определить, какой тип биометрии поддерживается устройством.

LAContext *laContext = [[LAContext alloc] init];

NSError *error;

if ([laContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {

    if (error != NULL) {
        // handle error
    } else {

        if (@available(iOS 11.0.1, *)) {
            if (laContext.biometryType == LABiometryTypeFaceID) {
                //localizedReason = "Unlock using Face ID"
                NSLog(@"FaceId support");
            } else if (laContext.biometryType == LABiometryTypeTouchID) {
                //localizedReason = "Unlock using Touch ID"
                NSLog(@"TouchId support");
            } else {
                //localizedReason = "Unlock using Application Passcode"
                NSLog(@"No Biometric support");
            }
        } else {
            // Fallback on earlier versions
        }


        [laContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Test Reason" reply:^(BOOL success, NSError * _Nullable error) {

            if (error != NULL) {
                // handle error
            } else if (success) {
                // handle success response
            } else {
                // handle false response
            }
        }];
    }
}
person Krunal    schedule 15.02.2018