Lliçó 6 de 10 · 14 min de lectura · Revisada el 26/10/2026
Formularis, teclats i autenticació accessible a les aplicacions
Estàs llegint una lliçó oberta. Matricula't per fer els tests i els exercicis, desar el teu progrés i aconseguir el certificat.
Matricula-m'hi · nivell 6 (119 €)Donar-se d'alta, iniciar la sessió, demanar una cita, signar una operació, pagar: gairebé totes les tasques crítiques d'una aplicació passen per un formulari. Al mòbil, a més, s'escriu amb un teclat en pantalla que tapa mitja interfície, es copien codis que arriben per SMS i es combinen contrasenyes, biometria i gestors de credencials. Al curs de formularis web del nivell 3 vas veure els fonaments (etiquetes, errors, autocomplete, 3.3.7 i 3.3.8). Aquesta lliçó els trasllada a les API natives d'iOS, Android i els frameworks multiplataforma, amb els errors que més es repeteixen a les aplicacions de banca, administració i comerç electrònic.
Etiquetes visibles i persistents
El patró més estès al mòbil és el camp amb placeholder (text d'exemple dins del camp) com a única etiqueta. En escriure, el text desapareix i la persona amb problemes de memòria o d'atenció ja no sap quin camp està emplenant; a més, el placeholder sol tenir poc contrast. Pot incomplir el 3.3.2 Etiquetes o instruccions tan bon punt el camp té contingut, i sovint l'1.4.3 Contrast (mínim).
- Android:
TextInputLayoutambandroid:hint(Views) o el paràmetrelabeld'OutlinedTextFielda Compose Material 3; tots dos converteixen el text en una etiqueta flotant que continua visible i s'exposa com a nom accessible. El paràmetreplaceholderés només un exemple addicional. - iOS: col·loca una etiqueta visible a sobre del camp i assigna-la com a
accessibilityLabelde l'UITextField; a SwiftUI, combina unTextvisible ambTextFieldi aplica.accessibilityLabelsi el títol del camp no coincideix amb l'etiqueta visible. - Coherència amb l'etiqueta visible: el 2.5.3 Etiqueta en el nom exigeix que el nom accessible contingui el text visible. Si es veu «Codi postal», el nom no pot ser «CP» ni «camp 4»; Voice Control i Accés per veu en depenen.
Tipus de teclat i propòsit de l'entrada
Triar el teclat adequat no és un criteri WCAG per si mateix, però redueix els errors i l'esforç per a tothom: teclat numèric per al codi postal, de correu per a l'adreça electrònica, de telèfon per al mòbil. Més important és el criteri 1.3.5 Identificació del propòsit de l'entrada (AA): els camps que demanen dades de la mateixa persona n'han d'exposar el propòsit de manera que el sistema els pugui emplenar automàticament. A les aplicacions, WCAG2ICT l'interpreta per mitjà dels mecanismes d'emplenament automàtic de la plataforma.
// iOS (UIKit)
correoField.keyboardType = .emailAddress
correoField.textContentType = .emailAddress
cpField.keyboardType = .numberPad
cpField.textContentType = .postalCode
// SwiftUI
TextField("Correu electrònic", text: $correo)
.keyboardType(.emailAddress)
.textContentType(.emailAddress)
.textInputAutocapitalization(.never)
// Android (Views, XML)
<EditText
android:id="@+id/correo"
android:inputType="textEmailAddress"
android:autofillHints="emailAddress" />
// Compose (les versions recents exposen el tipus de contingut com a semàntica)
OutlinedTextField(
value = correo, onValueChange = { correo = it },
label = { Text("Correu electrònic") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email, imeAction = ImeAction.Next),
modifier = Modifier.semantics { contentType = ContentType.EmailAddress }
)
// React Native
<TextInput autoComplete="email" textContentType="emailAddress" keyboardType="email-address" />
// Flutter
TextField(autofillHints: const [AutofillHints.email], keyboardType: TextInputType.emailAddress) Fes servir també imeAction o returnKeyType («Següent», «Fet») perquè la tecla de retorn avanci al camp següent en l'ordre lògic, i desactiva la correcció automàtica als camps on fa nosa (noms, NIF, IBAN).
Errors: identificar-los, descriure'ls i portar-hi
Els criteris són els mateixos que al web: 3.3.1 Identificació d'errors, 3.3.3 Suggeriments davant d'errors i, per als missatges que apareixen sense moure el focus, 4.1.3 Missatges d'estat. El que canvia és l'API:
- Compose:
OutlinedTextField(isError = true, supportingText = { Text("Introdueix un NIF amb 8 números i una lletra") })iModifier.semantics { error("NIF no vàlid") }perquè TalkBack anunciï l'error en arribar al camp. - Views:
textInputLayout.error = "Introdueix un NIF amb 8 números i una lletra"; el component mostra el text i l'exposa al servei d'accessibilitat. - iOS: el missatge d'error és un text visible al costat del camp; inclou-lo a l'
accessibilityValueo l'accessibilityHintdel camp i, en enviar, anuncia el nombre d'errors i porta el focus al primer (ho vas veure a l'exemple de la lliçó d'iOS).
Valida en enviar o en sortir del camp, no a cada pulsació: un missatge d'error que salta mentre algú escriu amb el lector de pantalla interromp constantment la lectura. I no indiquis mai l'error només amb una vora vermella (1.4.1 Ús del color) ni només amb una vibració: la vibració és un bon senyal addicional, mai l'únic (1.3.3 Característiques sensorials).
Exemple
Aplicació de cita prèvia: en prémer «Demana cita» amb el telèfon incomplet, la pantalla es desplaça fins al camp, mostra a sota «El telèfon ha de tenir 9 xifres; n'has escrit 8», el camp exposa l'error a TalkBack i VoiceOver, i un anunci indica «Hi ha 1 error al formulari». Les dades ja escrites es conserven: res no obliga a començar de nou.
Entrada redundant i processos de diversos passos
El 3.3.7 Entrada redundant (A) demana que, dins d'un mateix procés, no s'exigeixi tornar a escriure informació ja aportada: s'emplena automàticament o s'ofereix per seleccionar-la. En una aplicació d'enviaments, l'adreça de facturació ofereix «Fes servir l'adreça de lliurament»; en un tràmit de diversos passos, el NIF del pas 1 no es torna a demanar al pas 4. Les excepcions (tornar a escriure una contrasenya per seguretat, per exemple) són limitades.
En els processos de diversos passos, anuncia el pas actual amb el títol de la pantalla («Pas 2 de 4: dades de contacte»), conserva les dades en retrocedir i permet revisar abans de confirmar operacions amb efectes econòmics o legals (en aquesta línia va el criteri 3.3.4 Prevenció d'errors (legals, financers, dades)).
Autenticació accessible
El criteri 3.3.8 Autenticació accessible (mínim) (AA) prohibeix que un pas d'inici de sessió depengui d'una prova de funció cognitiva (recordar una contrasenya, transcriure un codi, resoldre un trencaclosques) llevat que hi hagi una alternativa o un mecanisme d'ajuda. En una aplicació, això es tradueix en:
- Permetre els gestors de contrasenyes i enganxar: marca els camps amb
.usernamei.password(o.newPassworda l'alta) a iOS, i ambautofillHintsusernameipassworda Android. No bloquegis l'enganxament en cap camp de credencials. - Oferir biometria o claus d'accés: Face ID, Touch ID o l'empremta (
BiometricPrompt) i les passkeys (claus d'accés, que iOS i Android integren al sistema i Android gestiona amb Credential Manager) eviten memoritzar. Però la biometria no pot ser l'única via: hi ha persones que no la poden fer servir. - Codis d'un sol ús que s'emplenen automàticament:
textContentType = .oneTimeCodea iOS suggereix el codi rebut per SMS sobre el teclat; a Android, la pistasmsOTPCoded'emplenament automàtic o les API d'SMS Retriever i SMS User Consent permeten emplenar-lo sense transcriure'l. - Temps suficient: si el codi caduca, avisa'n i permet demanar-ne un altre sense perdre el que s'ha fet (2.2.1 Temps ajustable).
- Sense CAPTCHA cognitiu: si cal protecció contra abusos, fes servir mecanismes que no exigeixin reconèixer imatges ni desxifrar caràcters (el 3.3.8 admet com a excepció el reconeixement d'objectes, però el 3.3.9, de nivell AAA, no).
Error freqüent
El codi de verificació es demana en sis caixes d'una xifra, cadascuna un camp independent. L'emplenament automàtic del sistema no funciona, enganxar el codi només emplena la primera caixa i VoiceOver anuncia sis camps sense etiqueta. L'alternativa correcta és un únic camp amb .oneTimeCode o smsOTPCode, l'etiqueta «Codi de 6 xifres» i, si es vol l'aparença de caixes, dibuixar-la sobre aquest únic camp.
Selectors, dates i camps especials
- Prefereix els selectors natius (
UIDatePicker,DatePickerde Material 3): són accessibles i, a més, permeten escriure la data. Un calendari a mida exigeix la feina de la lliçó d'Android: cada dia amb el nom complet, l'estat i el rol. - Els camps de contrasenya amb un botó «Mostra» necessiten nom i estat en aquest botó («Mostra la contrasenya», desactivat).
- Les caselles de condicions i privadesa han de ser controls reals (
Toggle,CheckboxoModifier.toggleable), amb el text associat com a etiqueta i un objectiu tàctil de 48 dp o 44 pt que inclogui aquest text. - Comprova que el teclat en pantalla no tapa el camp actiu ni el botó d'enviar (2.4.11 Focus no ocult (mínim)); a Android, ajusta el comportament amb
windowSoftInputModeo els insets del teclat a Compose.
Prova-ho tu
Obre la pantalla d'inici de sessió d'una aplicació que facis servir. Comprova si el gestor de contrasenyes del mòbil t'ofereix les teves credencials, si pots enganxar la contrasenya i si el codi de l'SMS apareix suggerit sobre el teclat. Qualsevol «no» és un indici d'incompliment del 3.3.8 o de l'1.3.5 que val la pena revisar.
Resum
- Etiquetes visibles i persistents, mai només un placeholder; el nom accessible conté el text visible (2.5.3).
- Teclat adequat i propòsit de l'entrada exposat amb
textContentType(iOS),autofillHints(Android i Flutter),contentType(Compose) oautoComplete(React Native) (1.3.5). - Errors en text, associats al camp, anunciats i amb un suggeriment de correcció (3.3.1, 3.3.3, 4.1.3); mai només color o vibració.
- No demanis dues vegades el mateix en un procés (3.3.7) i conserva les dades en retrocedir.
- Autenticació sense proves de memòria (3.3.8): gestors de contrasenyes, enganxament, biometria amb alternativa, claus d'accés i codis que s'emplenen automàticament en un únic camp.
Portes 6 lliçons d'aquest curs: que no es perdin
Crea el teu compte i desa el que ja has llegit i segueix el curs amb tot:
- El test d'aquesta lliçó (3 preguntes) per comprovar el que has après
- Exercicis pràctics amb pàgines reals
- El teu progrés desat: continues on ho vas deixar, des de qualsevol dispositiu
- Constància del curs amb les hores i certificat del nivell 6 quan aprovis l'examen
Entres amb el teu compte de Google o només amb el teu correu electrònic. No cal contrasenya.
Matricula-m'hi · nivell 6 (119 €)