Contraseñas generadas automáticamente en iOS 12

Si su aplicación tiene una función de registro que incluye la capacidad o la necesidad de ingresar un nuevo nombre de usuario y contraseña, lo más probable es que le interese la innovación en iOS 12 , que me gustaría describir. Este es un servicio que inventa nuevas contraseñas para el usuario, las sustituye automáticamente en los campos necesarios y las almacena de forma segura en Keychain .

Las contraseñas generadas automáticamente por el sistema son las más resistentes a la selección (al ser secuencias de caracteres generadas al azar, ajustadas para restricciones personalizadas, pero más sobre eso más adelante), alivian a los usuarios de la aplicación de la necesidad de crear una secuencia propia y están configuradas de manera flexible para las necesidades de una aplicación en particular. Sin embargo, el soporte para la nueva funcionalidad se proporciona con bastante facilidad, no sin características. Pero lo primero es lo primero.

Derechos y obligaciones


En primer lugar, la aplicación debe declarar su deseo de usar esta funcionalidad. En la lista de capacidades del objetivo correspondiente , primero debe tener un dominio en la lista de dominios asociados . Por extraño que parezca, la aplicación debe tener un "Dominio asociado" para poder usar las contraseñas generadas y almacenarlas en el "Llavero" del usuario (estas dos funciones están interconectadas y la generación no se puede usar por separado del almacenamiento).

Si la aplicación ya admite el uso de cuentas compartidas con su sitio (las llamadas "Credenciales compartidas") , este paso ya está atrasado. También puede estar retrasado, y si la aplicación admite enlaces universales u otro mecanismo para procesar "URL" externas.

De todos modos, después de agregar esta compatibilidad, la aplicación tendrá un nuevo "derecho" .

Además de esta compatibilidad más general, la aplicación también debe tener "Capacidad" "Proveedor de credenciales de autocompletar": esto permite que la aplicación, si tiene permiso del usuario, use los inicios de sesión y las contraseñas que ofrece el sistema. Agregar esta compatibilidad hará que aparezca el permiso de Autorización de proveedor de credenciales de Autocompletar .
Por cierto, la adición de esta y otras características está disponible solo para miembros del Programa de Desarrolladores de Apple .
El perfil de aprovisionamiento utilizado por la aplicación también debe incluir las siguientes dos características.

Dependencias utilizadas


Agregar la compatibilidad adecuada resultará en la aparición del marco de AuthenticationServices en la lista de Marcos y Bibliotecas Vinculadas del objetivo correspondiente. Este punto tiene algunas características que vale la pena mencionar.

En primer lugar, la adición automática de un marco relacionado puede no "funcionar" la primera vez: cuando inicio la aplicación en un dispositivo real desde mi copia de "Xcode" versión 10.1, la aplicación se "bloqueó" inmediatamente debido a la falta de "Servicios de autenticación". Eliminar manualmente el marco y volver a agregarlo a la lista de componentes relacionados resolvió el problema.

En segundo lugar, agregar automáticamente un marco lo marca como "Requerido". Si su aplicación implica la posibilidad de trabajar "bajo" versiones "iOS" inferiores a 12, esto también provocará que se bloquee en la fase de inicio "desde abajo" de los sistemas operativos de versiones inferiores. Los "Servicios de autenticación" están disponibles solo para los sistemas de la versión 12. Este problema se resuelve marcando el marco como "Opcional" .

Soporte de cuadro de texto


Para admitir la funcionalidad con campos de texto, se UITextInputTraits la variable textContentType protocolo textContentType . La clase UITextField , que probablemente se usa para ingresar el nombre de usuario y la contraseña en la aplicación, ya implementa los requisitos del protocolo que necesitamos.

textContentType es un campo de tipo UITextContentType contiene solo un conjunto de constantes. Lo que necesitamos en este momento es newPassword , que se utiliza para ingresar una nueva contraseña que se está inventando en este momento (no debe confundirse con solo la password utilizada para ingresar una contraseña existente).

 let passwordTextField = UITextField() if #available(iOS 12, *) { passwordTextField.textContentType = .newPassword } 

Establecer el valor de textContentType envuelto en una verificación de accesibilidad "API" , porque, al igual que la funcionalidad general, esta constante solo está disponible a partir de "iOS 12".

Además del tipo de contenido, el campo de texto debe proporcionar una entrada de datos segura:

 passwordTextField.isSecureTextEntry = true 

Aunque la aplicación puede proporcionar la funcionalidad de mostrar y ocultar la contraseña ingresada que es popular en nuestro tiempo, la contraseña generada se ofrecerá solo si en este momento la bandera es true .

Un punto interesante está relacionado con el tipo de contenido del campo de texto: si no hay otro campo en la pantalla, con el username tipo de contenido, no se ofrecerá la contraseña generada automáticamente. Esto se debe al hecho de que la funcionalidad se basa no solo en el tipo especificado de contenido de campo de texto, sino en un análisis heurístico del contenido de la pantalla .

Parece que la generación de contraseña "rompe" la lógica de las pantallas que requieren que se ingrese una nueva contraseña dos veces para verificar. Al menos todavía no he encontrado una manera de usar estas dos funcionalidades juntas. Y parece que no soy el único .

Vale la pena mencionar que si el inicio de sesión es semánticamente una dirección de correo electrónico (y, por lo tanto, realmente quiero tener el tipo de teclado apropiado), los tipos de teclado y contenido se pueden combinar:

 let userNameTextField = UITextField() userNameTextField.keyboardType = .emailAddress userNameTextField.textContentType = .username 

Requisitos de contraseña


A menudo, las contraseñas de los usuarios deben seguir ciertas reglas (tener cierta longitud, incluir ciertos caracteres, etc.). Estas reglas se pueden especificar para que el sistema las tenga en cuenta al generar contraseñas. Esto se realiza a través de la propiedad passwordRules del protocolo UITextInputTraits . Por ejemplo:

 if #available(iOS 12, *) { passwordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; minlength: 8;") } 

La propiedad también está disponible solo a partir de "iOS 12".

El tipo de la propiedad es UITextInputPasswordRules . Inicialización: utilizando una cadena de descriptor. El identificador tiene una sintaxis simple y consta de requisitos de contraseña simples, enumerados con un punto y coma. Cada requisito es un par clave-valor, separado por dos puntos. La clave es el tipo de regla (por ejemplo, "necesariamente incluye" - required ), y el valor es el elemento que debe seguir esta regla (por ejemplo, dígitos - digit ).

En el ejemplo anterior, el descriptor significa:

  • required: upper la presencia de al menos una letra mayúscula;
  • required: lower : lo mismo para al menos una letra minúscula;
  • required: digit : lo mismo para al menos un dígito en minúscula;
  • minlength: 8 - la longitud mínima es de ocho caracteres.

Se puede encontrar una lista detallada de posibles claves y valores en un buen artículo publicado en el sitio web de NSHipster .

Y Apple ofrece un asistente de compilación de descriptores bastante conveniente, que proporciona no solo una forma conveniente de construirlos, sino también una verificación de descriptores compilados en forma de un número ilimitado de ejemplos generados. Allí puede ver qué reglas se aplican por defecto.

Validación


Por si acaso, debe aclararse que el mecanismo de generación de contraseñas no proporciona validación de los datos ingresados ​​por el usuario; debe hacerlo usted mismo. Lo cual, por supuesto, es bastante lógico, porque el usuario de la aplicación puede rechazar la contraseña generada automáticamente propuesta o incluso prohibir la generación de contraseña y la finalización automática de campos.

Constructor de interfaz


Lo que es digno de mención y en el espíritu de nuestro tiempo, todas las configuraciones de campo de texto enumeradas se pueden establecer en el "Creador de interfaces" , hasta la "Regla de contraseña":

imagen

Comprobación de funcionalidad


La funcionalidad no es complicada, pero tiene varios matices: cuando la configura, puede olvidar algo fácilmente. En este caso, en los ensamblajes de "depuración", cuando se activa el campo de texto correspondiente, el motivo se mostrará en la consola para la cual la funcionalidad no está funcionando actualmente.

Por ejemplo:

 [AutoFill] Cannot show Automatic Strong Passwords for app bundleID: <...> due to error: Cannot save passwords for this app. Make sure you have set up Associated Domains for your app and AutoFill Passwords is enabled in Settings 

Además, siempre debe tener en cuenta que este tipo de funcionalidad se encuentra entre las acciones que requieren permiso del usuario. En este caso, se requieren dos:

1. Llavero de iCloud;
2. Autocompletar.

Conclusión


Esto parece ser todo a lo que se debe prestar atención mientras se brinda soporte para nuevas funciones. Si alguien en el proceso de trabajar en esto ha encontrado otras características interesantes, comentaré una vez y, si es necesario, asegúrese de complementar el artículo.

¡La característica es bastante interesante y, si se usa correctamente, es bastante capaz de mejorar la experiencia del usuario de su aplicación!

Source: https://habr.com/ru/post/438580/


All Articles