Table of Contents
Introdução à Autenticação Biométrica no iOS
A autenticação biométrica tornou-se uma pedra angular da segurança móvel moderna, oferecendo um equilíbrio entre conveniência e proteção. Para os desenvolvedores iOS, o framework LocalAuthentication fornece uma API simples e poderosa para integrar a verificação Touch ID, Face ID e código de acesso de dispositivos em aplicativos. Este artigo percorre o processo completo de implementação de autenticação biométrica usando a LocalAuthentication, desde a configuração inicial até as melhores práticas prontas para produção, garantindo que seu aplicativo atenda aos mais altos padrões de privacidade e segurança do usuário.
No final deste guia, você entenderá como verificar a disponibilidade biométrica, alertar os usuários para autenticação, lidar com erros graciosamente e fornecer mecanismos de retorno – tudo isso seguindo as diretrizes da Apple para privacidade do usuário e proteção de dados.
Compreender o Quadro de Autorização Local
A plataforma de autenticação Local, introduzida no iOS 8, fornece uma interface unificada para avaliar a identidade do usuário através de biometria ou um código de acesso do dispositivo. Ele abstrai as diferenças de hardware subjacentes entre o Touch ID e o Face ID, permitindo que você escreva a lógica de autenticação que funciona perfeitamente em todos os dispositivos iOS suportados.
Os principais componentes do quadro incluem:
- LAContext: O objeto central que gerencia políticas de autenticação, strings de razão localizadas e comportamento de retrocesso.
- LAPolítica: Políticas predefinidas que determinam o método de autenticação. As duas mais comuns são (somente biométrica) e ] (biometria com recuo do código passe).
- LAError: Códigos de erro que informam seu aplicativo por que a autenticação falhou—biometria não disponível, usuário cancelado, código de senha não definido, entre outros.
Embora o framework seja simples de usar, a implementação adequada requer atenção cuidadosa à experiência do usuário, ao tratamento de erros e à segurança. Vamos explorar as opções de política em mais detalhes.
Políticas de autenticação explicadas
- – Se a biometria (Touch ID ou Face ID) estiver inscrita e disponível, esta política apenas solicita ao usuário para verificação biométrica. Se a biometria não estiver disponível, a avaliação da política falha sem oferecer um recuo de código de acesso. Isto é adequado para operações de baixo risco onde você deseja uma experiência sem atrito e pode lidar com a falta de biometria graciosamente.
- – Esta política tenta primeiro a verificação biométrica. Se a biometria não estiver disponível, o usuário falha na inscrição, ou o usuário cancela o prompt biométrico, seu aplicativo pode voltar para o código de acesso do dispositivo. Esta é a política recomendada para a maioria dos cenários de autenticação, pois garante que mesmo quando a biometria não é uma opção, o usuário ainda pode autenticar usando o código de acesso.
É importante notar que o recuo do código de acesso só aparece após o usuário cancelar o prompt biométrico ou se a biometria falhar e o usuário tocar em "Enter Passcode". Você deve lidar com esses eventos corretamente para evitar confundir o usuário.
Implementação passo a passo
A implementação da autenticação biométrica envolve cinco passos claros: importar o framework, criar uma instância , verificar se a política desejada pode ser avaliada, realizar a avaliação e lidar com o resultado. Abaixo está uma detalhada desagregação com exemplos de código.
1. Importar o Quadro
Comece por importar em qualquer arquivo Swift onde você planeja usar autenticação. Esta importação lhe dá acesso a , , e todos os tipos de erro.
import LocalAuthentication
2. Criar um LAContext
é o objeto que consulta o estado do sistema e realiza a avaliação de autenticação. Você pode opcionalmente configurar propriedades como (a mensagem mostrada ao usuário) e (o texto para o botão de retrocesso). Por exemplo, você pode alterar o título de retrocesso para “Use o Código de Passagem” em vez do padrão “Enter Password”.
let context = LAContext()
context.localizedFallbackTitle = "Use Passcode"
3. Verificar disponibilidade biométrica
Antes de pedir ao usuário, você deve verificar se a política escolhida pode ser avaliada. Esta verificação é essencial para evitar uma falha abrupta que possa confundir o usuário. Use o método , passando a política que você pretende usar. O método retorna um valor booleano. Se ele retornar , o parâmetro (um ponteiro ]) conterá detalhes sobre por que a avaliação não é possível.
var error: NSError?
let canEvaluate = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error)
if !canEvaluate {
// Handle the error – see section on error handling below
print("Authentication not available: \(error?.localizedDescription ?? "Unknown error")")
return
}
As razões comuns para a falha incluem: o dispositivo não suporta a biometria, não há impressões digitais ou rosto, o código de acesso do dispositivo não está definido ou o aplicativo não tem direito ao Face ID (ver melhores práticas).
4. Avaliar a Política
Uma vez que tenha confirmado que a política pode ser avaliada, ligue para . O parâmetro é uma string que explica por que sua aplicação precisa de autenticação. Esta string deve ser clara e fácil de usar porque é exibida no prompt do sistema. Para o Face ID, a razão é sempre mostrada; para o Touch ID, ela pode ser mostrada dependendo da configuração do dispositivo.
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Authenticate to access your secure data") { success, evaluateError in
DispatchQueue.main.async {
if success {
// Authentication successful
print("User authenticated successfully")
} else {
// Authentication failed or was cancelled
print("Authentication failed: \(evaluateError?.localizedDescription ?? "Unknown error")")
}
}
}
Observe que o manipulador de conclusão não está garantido para executar no tópico principal. Sempre envie atualizações de UI e lógica subsequente para a fila principal, como mostrado acima.
5. Lidar com o resultado
Quando a autenticação tiver sucesso, você pode permitir com confiança o acesso a conteúdos ou ações protegidos. Quando falhar, você precisa determinar a causa inspecionando o . O erro será do tipo , que é um eno conforme . Os casos comuns incluem:
- .userCancel: O usuário tocou em “Cancelar” na prompt biométrica. Você pode simplesmente descartar o fluxo de login ou tentar novamente.
- .userFallback: The user tapped the fallback button (e.g., “Enter Password”). This triggers the passcode entry if using
.deviceOwnerAuthentication, but if you only used.deviceOwnerAuthenticationWithBiometrics, no fallback occurs. In that case, you should present your own passcode entry screen. - .biometryNotAvailable: Biometry is not available on this device (e.g., missing hardware). You should switch to passcode-only authentication.
- .biometryNotEnrolled: No biometric data is enrolled. Prompt the user to set up Touch ID or Face ID in Settings.
- .biometryLockout: Too many failed attempts; the system has locked biometry. You need to fall back to the passcode. The system passcode will reset the lockout.
- .passcodeNotSet: The device has no passcode configured. The user must set a passcode for biometry to work. Display an alert directing them to Settings.
Handling each of these cases gracefully is essential for a smooth user experience. For a production app, consider centralising your authentication logic in a manager class and providing clear feedback to the user.
Complete Example with Error Handling
Below is a more complete example that demonstrates a real-world authentication flow. It checks availability, handles errors with appropriate user alerts, and provides a fallback to a custom passcode entry if the user cancels biometry.
import LocalAuthentication
import UIKit
class BiometricAuthManager {
static let shared = BiometricAuthManager()
private let context = LAContext()
func authenticate(completion: @escaping (Bool, String?) -> Void) {
var error: NSError?
context.localizedFallbackTitle = "Use Passcode"
guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else {
// Determine the reason why authentication is unavailable
let message = errorMessage(for: error)
completion(false, message)
return
}
// Possibly show a loading state
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Authenticate to access your account") { success, evaluateError in
DispatchQueue.main.async {
if success {
completion(true, nil)
} else {
let message = self.errorMessage(for: evaluateError as? LAError)
completion(false, message)
}
}
}
}
private func errorMessage(for error: LAError?) -> String {
guard let error = error else {
return "Authentication could not be completed."
}
switch error.code {
case .biometryNotAvailable:
return "Biometric authentication is not available on this device."
case .biometryNotEnrolled:
return "No biometric data is enrolled. Please set up Face ID or Touch ID in Settings."
case .biometryLockout:
return "Too many failed attempts. Please use your passcode to unlock biometrics."
case .passcodeNotSet:
return "A device passcode is required to use biometric authentication."
case .userCancel:
return "Authentication cancelled by user."
case .userFallback:
return "User chose to use the passcode."
default:
return "Authentication failed: \(error.localizedDescription)"
}
}
}
Esta classe encapsula a lógica de autenticação e retorna um resultado limpo de sucesso/fracasso com uma mensagem amigável. Seus controladores de visão podem chamar e reagir de acordo.
Melhores Práticas e Considerações sobre Produção
Embora o código acima forneça uma base sólida, várias práticas adicionais garantirão que sua implementação seja robusta, segura e amigável.
Fornecer sempre um Fallback do Código de Passagem
Mesmo que você use a política , você deve ter sua própria tela de entrada de código de acesso pronta. Muitos usuários podem não ter a biometria registrada ou podem preferir usar uma senha em certas situações. Diretrizes de Interface Humana da Apple recomendam oferecer uma alternativa clara à biometria.
Use uma Razão Descritiva Localizada
A string é mostrada no prompt do sistema. Esta string deve ser concisa e específica para a ação que o usuário está prestes a autorizar. Por exemplo, “Inscreva-se em sua conta” é melhor do que uma vaga “Autenticação necessária”. Também localize esta string para diferentes idiomas.
Respeitar a Privacidade do Usuário
Nunca guarde dados biométricos (modelos de impressão digital ou mapas faciais) você mesmo. O sistema gerencia esses dados com segurança no Enclave Seguro. Seu aplicativo recebe apenas um resultado Booleano de sucesso/fracasso, não os dados biométricos reais. Não tente contornar esta separação.
Teste em Dispositivos Verdadeiros
O simulador tem capacidades de simulação biométrica limitadas. Sempre teste Touch ID e Face ID em iPhones e iPads reais. Para Face ID, você também deve incluir a chave em seu ; caso contrário, o aplicativo vai falhar ao tentar avaliar Face ID.
Lidar com o ciclo de vida da aplicação
Se o seu aplicativo usa autenticação biométrica para proteger um estado de fundo, considere reautenticar quando o aplicativo retorna ao primeiro plano. Você pode observar e solicitar autenticação novamente. No entanto, evite pedir autenticação com muita frequência – um padrão comum é exigir a reautênticação apenas após um período de tempo.
Combine com chaveiro para uma segurança mais forte
A autenticação biométrica só verifica a identidade do usuário no momento da verificação. Para segurança persistente (por exemplo, armazenar tokens de API), combine biometria com o Keychain. Use a classe com as bandeiras ou para garantir que os segredos armazenados só podem ser acessados após autenticação biométrica ou senha bem sucedida. O Keychain então atua como um cofre seguro que automaticamente trava quando o dispositivo está bloqueado.
Retirada após bloqueio
Quando a biometria estiver bloqueada devido a muitas tentativas falhadas, você deve voltar ao código de acesso do dispositivo. A entrada do código de acesso do sistema irá reiniciar automaticamente o bloqueio biométrico, de modo que, após uma entrada de código de acesso bem sucedida, futuras tentativas biométricas funcionarão novamente. Não tente contornar isso; é uma funcionalidade de segurança para proteger contra ataques de força bruta.
Diferenças entre o ID de toque e o ID facial
Embora o framework LocalAutentication abstraa a maioria das diferenças, há algumas nuances a se ter em mente:
- O ID de Face requer um dispositivo com uma câmara TrueDepth. Você deve verificar após chamar para determinar qual tipo biométrico está disponível. Isto permite-lhe ajustar as suas etiquetas de UI e ícones de acordo.
- O ID Face tem maior sensibilidade para viajar. O usuário deve olhar diretamente para o dispositivo. Certifique-se de que o seu explica por que o aplicativo precisa de ID Face.
- Aparência alternativa para Face ID: iOS 15.4 e depois permitir que os usuários configurem uma aparência alternativa (por exemplo, com óculos ou máscara).A sua aplicação não precisa de fazer nada de especial; o sistema lida com ela automaticamente.
- Suporte à máscara com Face ID: As versões recentes do iOS suportam desbloquear com uma máscara usando o Apple Watch. Para autenticação de nível de aplicativo, o prompt padrão do Face ID pode ainda exigir reconhecimento facial completo, a menos que o usuário tenha optado por usar máscara com o Apple Watch. O retorno do aplicativo ao código de senha cobrirá este cenário.
Erro no tratamento de mergulho profundo
Nós cobrimos brevemente erros comuns, mas vale a pena elaborar sobre como responder a cada um de uma forma amigável.
| Error Code | User Feedback |
|---|---|
biometryNotAvailable | Show an alert: “Face ID / Touch ID is not available on this device. Please use your passcode.” Then offer your custom passcode screen. |
biometryNotEnrolled | Present an alert that directs the user to Settings > Face ID & Passcode (or Touch ID & Passcode). You can open Settings directly using UIApplication.openSettingsURLString. |
biometryLockout | Prompt the user to authenticate using the device passcode. The system passcode entry will reset the lockout. If you use the .deviceOwnerAuthentication policy, the system automatically handles the passcode prompt. If you used .deviceOwnerAuthenticationWithBiometrics, you must fall back to your own passcode entry or invoke the .deviceOwnerAuthentication policy again to trigger the system passcode UI. |
passcodeNotSet | Alert the user that a device passcode is required. Direct them to Settings to set one. You cannot continue until the passcode is configured. |
userCancel | Simply dismiss or return to the previous screen. Do not show an error; the user intentionally cancelled. |
userFallback | The user chose the fallback option. Present your own passcode entry screen (or rely on the system passcode if you used the combined policy). |
Desempenho e Threading
O método é assíncrono e não bloqueia o tópico principal. Contudo, o manipulador de completação pode ser chamado em um tópico de fundo. Sempre envia atualizações de UI para a fila principal. Além disso, evite criar um novo para cada tentativa de autenticação; reutilize uma instância, se possível, mas esteja ciente de que o contexto pode ficar inválido após um bloqueio biométrico ou reinicialização do dispositivo. Como uma prática melhor, crie um novo contexto para cada sessão para garantir que você tenha o estado mais recente.
Autenticação Biométrica de Testes
Você pode simular autenticação biométrica no simulador iOS usando o menu Hardware. Para Touch ID, você pode escolher "Touch ID" e, em seguida, "Matching Touch" ou "Não-matching Touch". Para Face ID, o simulador permite que você inscreva um rosto e então realize tentativas de correspondência ou não-matching. No entanto, alguns cenários (como lockout) não são totalmente simulados. Portanto, testes de dispositivo reais são indispensáveis.
Além disso, você pode usar os planos de teste do Xcode para escrever testes unitários em torno do seu gerenciador de autenticação, zombando da classe – desde que você projete seu código com injeção de dependência. Isso permite testar a lógica de gerenciamento de erros sem depender de hardware real.
Recursos externos
Para leitura e documentação oficial, consultar o seguinte:
- Documentação de autenticação local da Apple[
- Referência da classe de contexto LA
- WWDC 2017 – Construir aplicações com identificação facial
- Serviços de chave e controlo de acesso biométrico
Conclusão
A implementação de autenticação biométrica com o framework LocalAutentication é um processo simples que melhora significativamente a postura de segurança do aplicativo iOS, mantendo uma experiência fluida do usuário. Ao verificar a disponibilidade, lidar com erros graciosamente e fornecer opções de retrocesso confiáveis, você pode criar um sistema de autenticação que respeite a privacidade do usuário e atenda às diretrizes rigorosas da Apple.
Lembre-se que a autenticação biométrica é apenas uma peça de uma estratégia de segurança abrangente. Combine-a com armazenamento seguro através do Keychain, segurança de rede e gerenciamento de sessão adequado para oferecer aos seus usuários o mais alto nível de proteção. Com o código e as melhores práticas compartilhados neste artigo, você está bem equipado para integrar Touch ID e Face ID no seu próximo projeto iOS.