J'ai intégré/implémenté l'authentification Face ID (authentification locale) pour mon application et tout fonctionne bien, sauf l'interface de la fenêtre Face ID Prompt Alert.
Il montre, un carré arrondi avec un fond gris clair et le titre "Face ID" .
Que faut-il définir pour la zone vide exactement au-dessus du titre? Cet espace est-il pour l'icône d'identification de visage? si oui, comment puis-je le régler? J'ai tout essayé dans LAContext et LAPolicy.
Regardez cet instantané:
Voici mon code:
let laContext = LAContext()
var error: NSError?
let biometricsPolicy = LAPolicy.deviceOwnerAuthenticationWithBiometrics
if (laContext.canEvaluatePolicy(biometricsPolicy, error: &error)) {
if let laError = error {
print("laError - \(laError)")
return
}
var localizedReason = "Unlock device"
if #available(iOS 11.0, *) {
switch laContext.biometryType {
case .faceID: localizedReason = "Unlock using Face ID"; print("FaceId support")
case .touchID: localizedReason = "Unlock using Touch ID"; print("TouchId support")
case .none: print("No Biometric support")
}
} else {
// Fallback on earlier versions
}
laContext.evaluatePolicy(biometricsPolicy, localizedReason: localizedReason, reply: { (isSuccess, error) in
DispatchQueue.main.async(execute: {
if let laError = error {
print("laError - \(laError)")
} else {
if isSuccess {
print("sucess")
} else {
print("failure")
}
}
})
})
}
Cela ne se produit que dans le simulateur, dans le périphérique réel, le canevas est occupé par une animation d'icône de visage.
Le localizedReason est uniquement pour Touch ID, car ils partagent tous les deux la même API.
Ils ont tous exécuté le même code:
func beginFaceID() {
guard #available(iOS 8.0, *) else {
return print("Not supported")
}
let context = LAContext()
var error: NSError?
guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
return print(error)
}
let reason = "Face ID authentication"
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { isAuthorized, error in
guard isAuthorized == true else {
return print(error)
}
print("success")
}
}
Voici le code de travail pour TouchID et FaceID avec tous les codes d'erreur (Swift 4)
Dans tout projet utilisant la biométrie, incluez la clé NSFaceIDUsageDescription dans le Info.plist
fichier. Sans cette clé, le système ne permettra pas à votre application d'utiliser Face ID.
let authContext = LAContext()
authContext.localizedFallbackTitle = "Use Passcode"
authContext.localizedCancelTitle = "Cancel"
var authError: NSError?
if authContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authError) {
evaluatePolicy(policy, context: authContext)
} else {
guard let error = authError else { return }
print("Error: \(error.code)")
checkError(error)
}
private func evaluatePolicy(_ policy: LAPolicy, context: LAContext) {
context.evaluatePolicy(policy, localizedReason: reason) { (success, error) in
if success {
print("Success")
} else {
guard let error = error else { return }
self.checkError(error as NSError)
}
}
}
private func checkError(_ error: NSError) {
guard let error = error as? LAError else { return }
switch error.code {
case .authenticationFailed:
print("authenticationFailed")
requestAuth(policy: .deviceOwnerAuthentication)
case .userFallback:
print("userFallback")
requestAuth(policy: .deviceOwnerAuthentication)
case .userCancel:
print("userCancel")
case .systemCancel:
print("systemCancel")
case .passcodeNotSet:
print("passcodeNotSet")
case .appCancel:
print("appCancel")
case .invalidContext:
print("invalidContext")
case .notInteractive:
print("notInteractive")
default:
checkBioMetricError(error)
}
}
private func checkBioMetricError(_ error: LAError) {
if #available(iOS 11.0, *) {
switch error.code {
case .biometryNotAvailable,
.biometryNotEnrolled,
.biometryLockout:
requestAuth(policy: .deviceOwnerAuthentication)
default: break
}
} else {
switch error.code {
case .touchIDNotAvailable,
.touchIDNotEnrolled,
.touchIDLockout:
requestAuth(policy: .deviceOwnerAuthentication)
default: break
}
}
}