traduccion - iOS8 verifica si el dispositivo tiene Touch ID
touch id iphone 6 no funciona (5)
Aquí puede comprobar, Touch-ID y Face-ID (con iOS 11+)
Use la propiedad LAContext
de LAContext
para verificar y evaluar la política biométrica disponible. (Para una autenticación de contraseña, cuando falla la biométrica, use: LAPolicyDeviceOwnerAuthentication
)
Prueba esto y ve:
C objetivo:
LAContext *laContext = [[LAContext alloc] init];
NSError *error;
// For a passcode authentication , when biometric fails, use: LAPolicyDeviceOwnerAuthentication
//if ([laContext canEvaluatePolicy: LAPolicyDeviceOwnerAuthentication error:&error]) {
if ([laContext canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
if (error != NULL) {
// handle error
} else {
if (@available(iOS 11, *)) {
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 or Denied 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
}
}];
}
}
Rápido:
let laContext = LAContext()
var error: NSError?
let biometricsPolicy = LAPolicy.deviceOwnerAuthentication //LAPolicy.deviceOwnerAuthenticationWithBiometrics
if laContext.isCredentialSet(LACredentialType.applicationPassword) {
print("Passsword is set")
}
let localizedFallbackTitle = "Unlock Using Device Passcode"
let localizedCancelTitle = "Use Application Passcode"
if (laContext.canEvaluatePolicy(biometricsPolicy, error: &error)) {
if let laError = error {
print("laError - /(laError)")
return
}
//print("biometricsPolicy - /(biometricsPolicy.rawValue)")
UINavigationBar.appearance().tintColor = UIColor.red
var localizedReason = "My Reason to be displayed on face id prompt"
if #available(iOS 11.0, *) {
if (laContext.biometryType == LABiometryType.faceID) {
//localizedReason = "Unlock using Face ID"
print("FaceId support")
} else if (laContext.biometryType == LABiometryType.touchID) {
//localizedReason = "Unlock using Touch ID"
print("TouchId support")
} else {
//localizedReason = "Unlock using Application Passcode"
print("No Biometric support")
}
} else {
// Fallback on earlier versions
}
laContext.localizedFallbackTitle = localizedFallbackTitle
laContext.localizedCancelTitle = localizedCancelTitle
//laContext.localizedReason = "test loc reason"
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")
}
}
})
})
}
LAContext tiene un método para verificar si el dispositivo puede evaluar la identificación táctil y da un mensaje de error. El problema es que el sistema da el mismo mensaje de error "LAErrorPasscodeNotSet" en dos casos:
1) Si el usuario tiene Touch ID, pero lo desactivó en la configuración (iPhone 5s con iOS8)
2) Si el dispositivo no tiene Touch ID (iPad con iOS8)
P: ¿Cómo verificar si el dispositivo es compatible con Touch ID, pero no lo ha activado en la configuración?
Actualizar:
Había creado un ticket para Apple con respecto a este error (ID # 18364575) y recibió la respuesta:
"La ingeniería ha determinado que este problema se comporta según lo previsto en base a la siguiente información:
Si no se establece el código de acceso, no podrá detectar la presencia de Touch ID. Una vez que se establece el código de acceso, canEvaluatePolicy finalmente devolverá LAErrorTouchIDNotAvailable o LAErrorTouchIdNotEnrolled y podrá detectar la presencia / estado de Touch ID.
Si los usuarios han deshabilitado el código de acceso en el teléfono con Touch ID, sabían que no podrán usar Touch ID, por lo que las aplicaciones no necesitan detectar la presencia de Touch ID ni promover funciones basadas en Touch ID. "
En swift 3
fileprivate func deviceSupportsTouchId(success: @escaping () -> (), failure: @escaping (NSError) -> ()) {
let context = LAContext()
var authError: NSError?
let touchIdSetOnDevice = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &authError)
if touchIdSetOnDevice {
DispatchQueue.main.async {
success()
}
}
else {
DispatchQueue.main.async {
failure(error!)
}
}
}
deviceSupportsTouchId () devuelve Success si el dispositivo tiene capacidad de identificación táctil.
Si no es así, la función devolverá un error, dándole el siguiente código de error si touchIDNotEnrolled aún no está configurado.
LAError.Code.touchIDNotEnrolled.rawValue
Puedes manejarlo usando este valor.
Integración de Touch ID
Ahora llegamos a la parte principal del tutorial ... integrando Touch ID con la aplicación. Como resultado, Apple ha creado un código bastante estándar para acceder a Touch ID. El código proviene del marco de autenticación local y es el siguiente:
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = @"Used for quick and secure access to the test app";
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
// User authenticated successfully, take appropriate action
}
else {
// User did not authenticate successfully, look at error and take appropriate action
}
}];
}
else {
// Could not evaluate policy; look at authError and present an appropriate message to user }
Echemos un vistazo a cada línea para ver lo que hace:
Línea 1: Aquí creamos un objeto LAContext. La clase LAContext es responsable de manejar el contexto para la autenticación. En pocas palabras, usamos un objeto LAContext para verificar si un tipo de autenticación está disponible. En el caso de este tutorial, luego comprobaremos que "if" touch ID es una opción.
Línea 2: Necesitamos un NSError para que el LAContext pueda usarlo para regresar si hay un error.
Línea 3: establecimos una NSString con una descripción que puso en pantalla para que el usuario sepa por qué la vista de identificación táctil ha aparecido en la pantalla.
Línea 5: Aquí es donde colocamos la constante LAContext para usarla llamando al método canEvaluatePolicy: y enviándole una constante LAPolicy como argumento. En este caso, aprobamos LAPolicyDeviceOwnerAuthenticationWithBiometrics. Si esto falla, la ID táctil no se configura en un dispositivo compatible o la ID táctil no está disponible en el dispositivo ... piense que un iPhone 4S, 5 o 5c ejecuta la aplicación. Además, esto no incluye un dispositivo que ejecute iOS 7, por lo que si planea ejecutar la autenticación de huellas digitales en una aplicación, asegúrese de verificar que esté trabajando con un dispositivo compatible y, de no ser así, ponga otras opciones disponibles, como como contraseña en el código pin para acceder a la aplicación.
Líneas 6, 7 y 8: si el usuario puede autenticarse con datos biométricos, ahora podemos llamar el método evalPolicy en nuestro objeto LAContext. Hacemos esto pasando la misma constante, LAPolicyDeviceOwnerAuthenticationWithBiometrics, y también pasando nuestra cadena de razón y luego especificando un bloque para que la respuesta sea manejada.
Obtendremos un SÍ o un NO como resultado. Si un SÍ, entonces la línea 10 es donde colocamos el código para una respuesta positiva. Asimismo, en la línea 12 es donde ponemos nuestro código de falla.
Finalmente, en la línea 15, tenemos la instrucción ELSE que se ejecuta si la línea 5 falla la prueba ... es decir, la biométrica no está disponible. Podemos verificar el puntero de autenticación para obtener el motivo y presentarlo al usuario si es necesario.
Finalmente, para que esto no muestre errores, debemos importar el marco de autenticación local a nuestro proyecto:
Entonces, vamos a agregar este código a nuestro proyecto. Abra ViewController.m y, en la parte superior, importe el marco de autenticación local.
Para obtener más detalles, visite este enlace: http://www.devfright.com/touch-id-tutorial-objective-c/
Puede averiguar si un dispositivo admite el escaneo biométrico (touchID y faceID) al verificar el código de error como se muestra a continuación:
func deviceSupportsBiometricScanning() -> Bool {
var authError: NSError?
let _ = LAContext().canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError)
return authError?.code != kLAErrorBiometryNotAvailable.hashValue
}
Tal vez podría escribir su propio método para verificar en qué dispositivo se está ejecutando , porque si el error devuelto es el mismo, sería difícil saber exactamente si se admite la identificación de Touch. Iría con algo como esto:
int sysctlbyname(const char *, void *, size_t *, void *, size_t);
- (NSString *)getSysInfoByName:(char *)typeSpecifier
{
size_t size;
sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
free(answer);
return results;
}
- (NSString *)modelIdentifier
{
return [self getSysInfoByName:"hw.machine"];
}
Después de tener el identificador del modelo, solo verificaría si el identificador del modelo es igual a uno de los modelos que admiten Touch ID:
- (BOOL)hasTouchID
{
NSArray *touchIDModels = @[ @"iPhone6,1", @"iPhone6,2", @"iPhone7,1", @"iPhone7,2", @"iPad5,3", @"iPad5,4", @"iPad4,7", @"iPad4,8", @"iPad4,9" ];
NSString *model = [self modelIdentifier];
return [touchIDModels containsObject:model];
}
La matriz contiene todos los ID de modelo que admiten Touch ID, que son:
- iphone 5s
- iphone 6
- iPhone 6+
- iPad Air 2
- iPad Mini 3
El único inconveniente de este método es que una vez que se lanzan nuevos dispositivos con Touch ID, la matriz del modelo deberá actualizarse manualmente.