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":

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!