En un navegador real, el gestor de contraseñas muestra la credencial guardada en cuanto aparece el campo de login. Dentro de un WebView ese campo se queda vacío. En iOS, un WKWebView no muestra las contraseñas que el usuario guardó en el Keychain de Safari para contenido web; en Android, el autocompletado del WebView está desactivado por defecto y bloqueado por sugerencias de autocompletado, un contexto de actividad y un servicio del sistema. Un runtime propio del host conecta un proveedor de credenciales nativo: un campo de login que se rellena en todas partes.

iOS: sin contraseñas del Keychain para contenido web

La documentación de Password AutoFill de Apple explica cómo el sistema ofrece credenciales guardadas mediante textContentType, pero eso se aplica a los propios UITextField nativos de la app. Para el contenido web renderizado dentro de un WKWebView, el sistema no ofrece las contraseñas que el usuario guardó en Safari como lo hace Safari. La barra QuickType que aparece en Safari para un login guardado no está disponible de forma fiable en un WKWebView embebido cualquiera; las sugerencias de credenciales a nivel de página que el usuario espera simplemente no aparecen. Los gestores de contraseñas de terceros que funcionan como extensiones de Safari o de proveedor de credenciales tampoco están presentes dentro de la página embebida. El resultado: el usuario que tiene la contraseña guardada en Safari la vuelve a escribir a mano, dentro de tu app.

Android: el autocompletado está desactivado por defecto

El framework Autofill de Android admite WebView desde Chrome 61, pero es condicional y frágil. El WebView debe crearse con un contexto de actividad, los campos deben llevar autofillHints (o importantForAutofill debe configurarse correctamente) y el servicio del sistema Autofill del dispositivo debe estar activado y no anulado por la app o la ROM. Muchos WebViews desactivan el autocompletado por completo, y el autocompletado de gestores de contraseñas de terceros dentro del contenido del WebView es, en el mejor de los casos, inconsistente. El mismo login que se autocompleta perfectamente en Chrome puede quedar vacío dentro del navegador embebido, y, a diferencia de Chrome, la página no puede pedir al usuario que guarde o rellene.

Qué se rompe cuando el autocompletado muere

  • Cada login es un reescritura manual. La contraseña que el usuario guardó en su navegador es inalcanzable desde el WebView, en ambas plataformas.
  • Aparecen contraseñas más débiles y reutilizadas. Cuando rellenar es difícil, los usuarios recurren a contraseñas memorables o duplicadas: lo opuesto a lo que quiere una app financiera.
  • Los códigos de un solo uso también se complican. El autocompletado de SMS / TOTP vinculado al dominio que Safari ofrece de forma nativa no se muestra de forma fiable en la página embebida.
  • Suben el soporte y la desertización. Un login que «simplemente funciona» en el navegador se convierte en un punto de fricción en la app, y los tickets de soporte aumentan en consecuencia.

La solución del runtime

Un runtime propio del host conecta un proveedor de credenciales nativo. La página marca un campo con una sugerencia de autocompletado estándar, y el host lo resuelve mediante el proveedor de credenciales de la plataforma: ASPasswordCredentialIdentity / QuickType de dominio asociado en iOS, el framework Autofill y las extensiones de proveedor de credenciales en Android. Los logins guardados, las contraseñas generadas y los códigos de un solo uso se ofrecen de forma nativa y coherente. Una integración, cada motor, un campo relleno.

DimensiónWebViewRuntime propio del host
Contraseñas guardadas iOSNo se muestran para webProveedor de credenciales nativo
Autocompletado AndroidDesactivado por defecto, bloqueadoAutofill nativo + proveedor
Gestores de tercerosAusentes en la páginaConectados al host
Códigos de un solo usoPoco fiableRelleno nativo vinculado al dominio
ConsistenciaSegún el motorUniforme

Una app nativa ofrece el login guardado en todos los dispositivos. Un WebView estándar lo ofrece en casi ninguno. Un runtime da a la página un campo de login —y la credencial guardada del propio usuario al final.

Fuentes