Haz que tu AWP se parezca más a una app

Haz que tu Progressive Web App no se sienta como un sitio web, sino como una aplicación "real".

Cuando juegues al bingo de palabra de moda de la app web progresiva, una forma segura es establecer "Las AWP son solo sitios web". La documentación de Microsoft para AWP está de acuerdo, lo decimos en este mismo sitio, y hasta los nominadores a AWP Frances Berriman y Alex Russell escriben eso también. Sí, las AWP son solo sitios web, pero también son mucho más que eso. Si se hace bien, una AWP no parecerá un sitio web, sino una app "real". Ahora bien, ¿qué significa que se sienta como una app real?

Para responder esta pregunta, usaré la app de Podcasts de Apple como ejemplo. Está disponible en macOS para computadoras y en iOS (y iPadOS, respectivamente), en dispositivos móviles. Si bien Podcasts es una aplicación de medios, las ideas principales que ilustré con su ayuda también se aplican a otras categorías de apps.

Un iPhone y una MacBook uno al lado del otro, ambos ejecutando la aplicación Podcasts.
Podcasts de Apple en iPhone y macOS (fuente).

Puede ejecutarse sin conexión.

Si piensas en las aplicaciones específicas de cada plataforma que tienes en tu teléfono celular o computadora de escritorio, hay algo que se destaca claramente: nunca obtienes nada. En la app de Podcasts, siempre hay algo, incluso si estoy sin conexión. Cuando no hay conexión de red, la app se abre naturalmente. En la sección Gráficos de los elementos más populares, no se muestra ningún contenido, sino que se muestra el mensaje Can't connect right now (No se puede conectar en este momento) junto con el botón Retry. Puede que no sea la experiencia más agradable, pero entiendo algo.

La app de Podcasts muestra el mensaje de información "No se puede conectar en este momento" cuando no hay conexión de red disponible.
App de podcasts sin conexión de red.
Cómo hacer esto en la Web

La app de Podcasts sigue el modelo de shell de la app denominado modelo. Todo el contenido estático necesario para mostrar la app principal se almacena en caché de forma local, incluidas las imágenes decorativas, como los íconos de menú de la izquierda y los íconos de la IU del reproductor principal. El contenido dinámico, como los datos de los rankings de los elementos más populares, solo se carga a pedido; en caso de que falle la carga, el contenido alternativo está disponible en caché local. Lee el artículo El modelo de shell de app para obtener información sobre cómo aplicar este modelo de arquitectura a tu app web.

Contenido sin conexión disponible y multimedia reproducible

Mientras no tengo conexión, en el panel lateral izquierdo, puedo navegar a la sección Descargados y disfrutar de los episodios de podcasts descargados que están listos para reproducirse y se muestran con todos los metadatos, como el material gráfico y las descripciones.

App de Podcasts con un episodio descargado de un podcast en reproducción
Los episodios de podcast descargados se pueden reproducir incluso sin red.
Cómo hacer esto en la Web

El contenido multimedia descargado se puede entregar desde la caché, por ejemplo, con la receta Entregar audio y video almacenados en caché de la biblioteca Workbox. El resto del contenido siempre se puede almacenar en la caché o en IndexedDB. Lee el artículo Almacenamiento para la Web para obtener todos los detalles y saber cuándo usar cada tecnología de almacenamiento. Si tienes datos que deberían almacenarse de forma persistente sin el riesgo de borrarse definitivamente cuando la cantidad de memoria disponible sea baja, puedes usar la API de Persistent Storage.

Descarga proactiva en segundo plano

Cuando vuelvo a estar en línea, puedo buscar contenido con una consulta como http 203 y, cuando decido suscribirme al resultado de la búsqueda, el podcast HTTP 203, se descarga de inmediato el episodio más reciente de la serie, sin hacer preguntas.

La app de Podcasts descarga el episodio más reciente de un podcast inmediatamente después de suscribirse.
Después de suscribirte a un podcast, se descarga de inmediato el episodio más reciente.
Cómo hacer esto en la Web

Descargar un episodio de podcast es una operación que puede tardar más tiempo. La API de recuperación en segundo plano te permite delegar descargas al navegador, que las realiza en segundo plano. En Android, el navegador, a su vez, puede incluso delegar estas descargas al sistema operativo, por lo que no es necesario que el navegador se esté ejecutando continuamente. Una vez finalizada la descarga, se despierta el service worker de tu app y puedes decidir qué hacer con la respuesta.

Uso compartido e interacción con otras aplicaciones

La app de Podcasts se integra naturalmente con otras aplicaciones. Por ejemplo, cuando hago clic con el botón derecho en un episodio que me gusta, puedo compartirlo con otras apps de mi dispositivo, como la app de Mensajes. También se integra de forma natural con el portapapeles del sistema. Puedo hacer clic con el botón derecho en cualquier episodio y copiar un vínculo a él.

El menú contextual de la app de Podcasts invocado en un episodio de un podcast con la opción "Compartir episodio → Mensajes" seleccionada.
Compartir un episodio de podcast con la app de Mensajes
Cómo hacer esto en la Web

La API de Web Share y la API de Web Share Target permiten que tu app comparta y reciba textos, archivos y vínculos desde y hacia otras aplicaciones del dispositivo. Si bien aún no es posible que una aplicación web agregue elementos de menú al menú integrado con el botón derecho del sistema operativo, existen muchas otras maneras de establecer vínculos hacia y desde otras aplicaciones del dispositivo. Con la API de Async Clipboard, puedes leer y escribir datos de imagen y texto (imágenes PNG) de manera programática en el portapapeles del sistema. En Android, puedes usar la API de Contact Picker para seleccionar entradas del Administrador de contactos del dispositivo. Si ofreces tanto una app específica para la plataforma como una AWP, puedes usar la API de Get Installed Related Apps para comprobar si está instalada la app específica de la plataforma, en cuyo caso no necesitas alentar al usuario a instalar la AWP ni aceptar notificaciones push web.

Actualización de apps en segundo plano

En la configuración de la app de Podcasts, puedo configurar la app para que descargue episodios nuevos automáticamente. Así que ni siquiera tengo que pensarlo, el contenido actualizado siempre estará ahí. Magia.

El menú de configuración de la app de Podcasts en la sección "General", donde la opción "Actualizar podcasts" está establecida en "Cada hora".
Podcasts configurados para buscar nuevos episodios de podcast cada hora
Cómo hacer esto en la Web

La API de Periodic Background Sync permite que tu app actualice su contenido de manera regular en segundo plano sin necesidad de que se ejecute. Esto significa que hay contenido nuevo disponible de manera proactiva, de modo que los usuarios pueden comenzar a explorarlo de inmediato cuando lo decidan.

Estado sincronizado en la nube

Al mismo tiempo, mis suscripciones se sincronizan en todos los dispositivos que tengo. En un mundo tranquilo, no tengo que preocuparme manualmente por mantener sincronizadas mis suscripciones a podcasts. Del mismo modo, no tengo que tener miedo de que la memoria de mi dispositivo móvil se consuma por episodios que ya escuché en mi computadora. El estado de reproducción se mantiene sincronizado, y los episodios escuchados se borran automáticamente.

El menú de configuración de la app de Podcasts, en la sección "Configuración avanzada", donde está activada la opción "Sincronizar las suscripciones en todos los dispositivos".
El estado se sincroniza en la nube.
Cómo hacer esto en la Web

La sincronización de los datos de estado de la app es una tarea que puedes delegar a la API de sincronización en segundo plano. La operación de sincronización no tiene que ocurrir de inmediato, solo al final, y tal vez incluso cuando el usuario ya haya cerrado la app nuevamente.

Controles de teclas multimedia de hardware

Cuando estoy ocupado con otra aplicación, por ejemplo, leyendo una página de noticias en el navegador Chrome, aún puedo controlar la app de Podcasts con las teclas multimedia de mi laptop. No es necesario pasar a la aplicación solo para avanzar o retroceder.

Teclado mágico de Apple MacBook Pro con teclas multimedia anotadas.
Las teclas multimedia permiten controlar la app de Podcasts (fuente).
Cómo hacer esto en la Web

Las claves multimedia son compatibles con la API de Media Session. De este modo, los usuarios pueden usar las teclas multimedia de hardware en sus teclados físicos o auriculares, o incluso controlar la app web con las teclas multimedia de software de sus relojes inteligentes. Una idea adicional para suavizar las operaciones de búsqueda es enviar un patrón de vibración cuando el usuario busca una parte significativa del contenido, por ejemplo, pasar los créditos de apertura o el límite de un capítulo.

Tareas múltiples y acceso directo a apps

Por supuesto, siempre puedo realizar varias tareas a la vez con la app de Podcasts desde cualquier lugar. La app tiene un ícono claramente distinguible que también puedo colocar en mi escritorio o conector de aplicaciones para que los podcasts se puedan iniciar de inmediato cuando lo necesite.

El selector de tareas de macOS con varios íconos de apps para elegir, uno de ellos es la app de Podcasts.
Volver a realizar varias tareas a la vez en la app de Podcasts.
Cómo hacer esto en la Web

Las apps web progresivas para computadoras de escritorio y dispositivos móviles se pueden instalar en la pantalla principal, en el menú de inicio o en el acoplamiento de aplicaciones. La instalación puede realizarse a partir de una instrucción proactiva o completamente controlada por el desarrollador de la app. El artículo ¿Qué se necesita para instalar la aplicación? abarca todo lo que necesitas saber. Cuando se realizan varias tareas a la vez, las AWP aparecen independientemente del navegador.

Acciones rápidas en el menú contextual

Las acciones más comunes de la app, Search for new content y Check for New Episodes, están disponibles en el menú contextual de la app en el Dock. En el menú Opciones, también puedo abrir la app cuando accedas.

Menú contextual del ícono de la app de Podcasts con las opciones "Buscar" y "Buscar episodios nuevos"
Las Acciones rápidas están disponibles de inmediato desde el ícono de la app.
Cómo hacer esto en la Web

Especificando los accesos directos a íconos de apps en el manifiesto de la app web de la AWP, puedes registrar rutas rápidas a tareas comunes a las que los usuarios pueden acceder directamente desde el ícono de la app. En sistemas operativos como macOS, los usuarios también pueden hacer clic con el botón derecho en el ícono de la app y configurar que se inicie al momento de acceder. Estamos trabajando en una propuesta para la ejecución al acceder.

Actuar como app predeterminada

Otras aplicaciones para iOS, así como sitios web o correos electrónicos, pueden integrarse con la app de Podcasts con el esquema de URLs podcasts://. Si sigo un vínculo como podcasts://podcasts.apple.com/podcast/the-css-podcast/id1042283903 mientras estoy en el navegador, se me redirecciona directamente a la app de Podcasts y puedo decidir suscribirme o escuchar el podcast.

El navegador Chrome muestra un diálogo de confirmación en el que se le pregunta al usuario si quiere abrir la app de Podcasts.
La app de Podcasts se puede abrir directamente desde el navegador.
Cómo hacer esto en la Web

Aún no es posible controlar esquemas de URL completamente personalizados, pero aún se está trabajando en una propuesta de manejo de protocolos de URL para AWP. Actualmente, registerProtocolHandler() con un prefijo de esquema web+ es la mejor alternativa.

Integración del sistema de archivos local

Puede que no lo pienses inmediatamente, pero la aplicación Podcasts se integra naturalmente con el sistema de archivos local. Cuando descargo un episodio de podcast, en mi laptop, se almacenó en ~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache. A diferencia de, digamos ~/Documents, este directorio no está pensado para que los usuarios normales accedan directamente a él, pero está ahí. En la sección de contenido sin conexión, se hace referencia a otros mecanismos de almacenamiento además de los archivos.

El Finder de macOS navegó al directorio del sistema de la app de Podcasts.
Los episodios de podcasts se almacenan en una carpeta especial de la app del sistema.
Cómo hacer esto en la Web

La API de File System Access permite a los desarrolladores obtener acceso al sistema de archivos local del dispositivo. Puedes usarla directamente o a través de la biblioteca de compatibilidad browser-fs-access, que proporciona de forma transparente un resguardo para los navegadores que no son compatibles con la API. Por motivos de seguridad, no se puede acceder a los directorios del sistema desde la Web.

Aspecto de la plataforma

Hay algo más sutil que es evidente para una aplicación de iOS como Podcasts: ninguna de las etiquetas de texto es seleccionable y todo el texto se combina con la fuente del sistema de la máquina. También se respeta mi elección del tema de color del sistema (modo oscuro).

La app de Podcasts en modo oscuro.
La app de Podcasts admite los modos claro y oscuro.
App de Podcasts en modo claro.
La app usa la fuente predeterminada del sistema.
Cómo hacer esto en la Web

Cuando aprovechas la propiedad de CSS user-select con el valor none, puedes proteger los elementos de la IU para que no se seleccionen accidentalmente. Sin embargo, asegúrate de no abusar de esta propiedad para anular la selección del contenido de la app. Solo debe usarse para elementos de la IU, como textos de botones, etc. El valor system-ui de la propiedad de CSS font-family te permite especificar la fuente predeterminada de la IU del sistema que se usará para tu app. Por último, tu app puede obedecer la preferencia de esquema de colores del usuario respetando su elección de prefers-color-scheme, con un botón de activación del modo oscuro opcional para anularla. Otro aspecto por decidir podría ser qué debe hacer el navegador cuando se alcance el límite de un área de desplazamiento, por ejemplo, para implementar la función de extracción para actualizar personalizada. Esto es posible con la propiedad de CSS overscroll-behavior.

Barra de título personalizada

Cuando observas la ventana de la app de Podcasts, notas que no tiene una barra de título ni una barra de herramientas clásicas integradas, como, por ejemplo, la ventana del navegador Safari, sino una experiencia personalizada que parece una barra lateral anclada a la ventana del reproductor principal.

La barra de mosaicos y la barra de herramientas integradas del navegador Safari.
La barra de título personalizada dividida de la app Podcasts.
Barras de título personalizadas de Safari y Podcasts.
Cómo hacer esto en la Web

Si bien no es posible, por el momento, estamos trabajando en la personalización de la barra de título. Sin embargo, puedes (y debes) especificar las propiedades display y theme-color del manifiesto de la app web para determinar el aspecto de la ventana de tu aplicación y decidir qué controles predeterminados del navegador (posiblemente no se deben mostrar).

Animaciones breves

Las animaciones integradas en la app son rápidas y fluidas en Podcasts. Por ejemplo, cuando abro el panel lateral Notas de los episodios a la derecha, se desliza elegantemente hacia adentro. Cuando quito un episodio de mis descargas, los episodios restantes flotan y consumen el espacio en pantalla que liberó el episodio borrado.

La app de Podcasts con el panel lateral "Notas del episodio" expandido.
Las animaciones dentro de la app, como las de abrir un panel lateral, son rápidas.
Cómo hacer esto en la Web

Las animaciones de rendimiento en la Web son posibles si tienes en cuenta una serie de prácticas recomendadas que se describen en el artículo Animaciones y rendimiento. Las animaciones de desplazamiento, como se ven comúnmente en el contenido con paginación o los carruseles multimedia, se pueden mejorar significativamente con la función CSS Scroll Snap. Para obtener el control total, puedes usar la API de Web Animations.

Contenido que aparece fuera de la app

La app Podcasts en iOS puede mostrar contenido en otras ubicaciones distintas de la aplicación real, por ejemplo, en la vista Widgets del sistema o en forma de una sugerencia de Siri. Tener llamados a la acción proactivos y basados en el uso que solo requieren un toque para interactuar con ellos puede aumentar en gran medida la tasa de reactivación de la participación de una app como Podcasts.

Vista del widget de iOS que muestra la app Podcasts con sugerencias de un nuevo episodio de un podcast.
El contenido de la app aparece fuera de la app principal de Podcasts.
Cómo hacer esto en la Web

La API de Content Index permite que tu aplicación le indique al navegador qué contenido de la AWP está disponible sin conexión. De esta manera, el navegador puede mostrar este contenido fuera de la app principal. Si marcas el contenido interesante de tu app como apto para la reproducción de audio speakable y usas lenguaje de marcado estructurado en general, puedes ayudar a los motores de búsqueda y a los asistentes virtuales, como Asistente de Google, a presentar tus ofertas con una luz ideal.

Widget de control multimedia de la pantalla de bloqueo

Cuando se reproduce un episodio de podcast, la app de Podcasts muestra un hermoso widget de control en la pantalla de bloqueo que incluye metadatos como el material gráfico y el título del episodio y su nombre.

Widget de reproducción de contenido multimedia de iOS en la pantalla de bloqueo que muestra un episodio de podcast con metadatos enriquecidos.
El contenido multimedia que se reproduce en la app se puede controlar desde la pantalla de bloqueo.
Cómo hacer esto en la Web

La API de Media Session te permite especificar metadatos, como material gráfico, títulos de pistas, etc., que luego se muestran en la pantalla de bloqueo, relojes inteligentes y otros widgets multimedia en el navegador.

Notificaciones push

Las notificaciones push se convirtieron en una molestia en la Web (aunque ahora los mensajes de notificación son mucho más discretos). Pero si se usan correctamente, pueden agregar mucho valor. Por ejemplo, la app Podcasts para iOS puede notificarme de manera opcional los episodios nuevos de los podcasts a los que me suscribí o recomendarme nuevos, además de alertarme sobre las nuevas funciones de la app.

App de Podcasts para iOS en la pantalla de configuración “Notificaciones” que muestra el botón de activación de las notificaciones “Episodios nuevos”.
Las apps pueden enviar notificaciones push para informar a los usuarios sobre contenido nuevo.
Cómo hacer esto en la Web

La API de Push permite que tu app reciba notificaciones push para que puedas notificar a los usuarios sobre eventos destacados en torno a tu AWP. Para las notificaciones que deberían activarse en un momento conocido en el futuro y que no requieren una conexión de red, puedes usar la API de notificaciones.

Insignias del ícono de la app

Cuando hay nuevos episodios disponibles para uno de los podcasts al que me suscribí, aparece una insignia de ícono de la app en el ícono de la pantalla principal de Podcasts, que me motiva a volver a interactuar con la app de una manera que no es invasiva.

Pantalla de configuración de iOS que muestra el botón de activación "Insignias" activado.
Las insignias son una forma sutil en la que las aplicaciones informan a los usuarios sobre el contenido nuevo.
Cómo hacer esto en la Web

Puedes configurar insignias de íconos de la app con la API de Badging. Esto resulta particularmente útil cuando tu AWP tiene alguna noción de elementos "no leídos" o cuando necesitas un medio para dirigir la atención del usuario a la app de manera discreta.

La reproducción de contenido multimedia tiene prioridad sobre la configuración del ahorro de energía

Cuando se reproduce contenido multimedia de podcasts, es posible que se apague la pantalla, pero el sistema no entrará en modo en espera. De manera opcional, las apps también pueden mantener activa la pantalla, por ejemplo, para mostrar letras o subtítulos.

Preferencias de macOS en la sección “Ahorro de energía”.
Las apps pueden mantener la pantalla activa.
Cómo hacer esto en la Web

La API de Screen Wake Lock te permite impedir que se apague la pantalla. La reproducción de contenido multimedia en la Web impide automáticamente que el sistema entre en modo en espera.

Descubrimiento de apps en una tienda de aplicaciones

Si bien la app Podcasts forma parte de la experiencia de macOS para computadoras de escritorio, en iOS debe instalarse desde App Store. Si buscas rápidamente podcast, podcasts o apple podcasts, la app se mostrará en App Store de inmediato.

La búsqueda de "podcasts" en la App Store de iOS muestra la app Podcasts.
Los usuarios aprendieron a descubrir apps en las tiendas de aplicaciones.
Cómo hacer esto en la Web

Si bien Apple no permite AWP en App Store, en Android, puedes enviar tu AWP unida en una actividad web de confianza. La secuencia de comandos bubblewrap hace que esta operación sea sencilla. Esta secuencia de comandos también es lo que impulsa internamente la función de exportación de apps para Android de PWABuilder, que puedes usar sin tocar la línea de comandos.

Resumen de funciones

En la siguiente tabla, se muestra una descripción general compacta de todas las funciones y una lista de recursos útiles para aprovecharlas en la Web.

Atributo Recursos útiles para hacer esto en la Web
Se puede ejecutar sin conexión.
Contenido sin conexión disponible y contenido multimedia reproducible
Descarga proactiva en segundo plano
Interactuar con otras aplicaciones y compartir contenido con ellas
Actualización de apps en segundo plano
Estado sincronizado en la nube
Controles de teclas multimedia de hardware
Tareas múltiples y acceso directo a apps
Acciones rápidas en el menú contextual
Actuar como app predeterminada
Integración del sistema de archivos local
Diseño de la plataforma
Barra de título personalizada
Animaciones rápidas
Contenido que aparece fuera de la app
Widget de control multimedia de la pantalla de bloqueo
Notificaciones push
Insignias en el ícono de la app
La reproducción de contenido multimedia tiene prioridad sobre el ahorro de energía
Descubrimiento de apps en una tienda de aplicaciones

Conclusión

Las AWP han avanzado mucho desde su introducción en 2015. En el contexto del Proyecto Fugu 🐡, el equipo de Chromium que trabaja en varias empresas está trabajando para cerrar las últimas brechas. Si sigues solo algunos de los consejos de este artículo, podrás acercarte cada paso más a esa sensación de app y hacer que los usuarios se olviden de que están tratando con "solo un sitio web", ya que, honestamente, a la mayoría de ellos no les importa cómo se compila tu app (y por qué debería hacerlo), siempre que parezca una app real.

Agradecimientos

Este artículo fue revisado por Kayce Basques, Joe Medley, Joshua Bell, Dion Almaer, Ade Oshineye, Pete LePage, Sam Thorogood, Reilly Jeffys Grant y