====== Progressive Web Apps ======
Mejora de de las aplicaciones web para que parezcan aplicaciones nativas.
Características:
* Indistinguible de una aplicación nativa
* Funciona sin conexión a Internet.
* Utiliza **características nativas del dispositivo**.
* Se **actualiza constantemente**
* Atractiva para los usuarios
* Confiable
* **Pesa poco**
* Rápida en la carga
La gente pasa el 87 % de su tiempo en el móvil en aplicaciones nativas porque:
* Tienen notificaciones push (se comunican con el usuario, aunque la aplicación no esté abierta)
* Acceso a características del dispositivo: cámara, audio...
* Posibilidad de trabajar offline
Problemas de crear aplicaciones nativas:
* Aprendizaje de dos lenguajes diferentes (Android y iOS).
* Necesidad de instalación desde tienda de aplicaciones.
===== Arquitectura =====
Para convertir una aplicación web en una PWA se necesitan los siguientes elementos:
* Push server
* Manifest
* indexedDB
* Service Worker
===== Conceptos clave =====
Las aplicaciones PWA deben ser servidas utilizando un protocolo seguro (HTTPS) y contar con un certificado. La única excepción es http://localhost
==== Service worker ====
Corazón de una PWA. Archivo de JavaScript (''sw.js'' o ''service-worker.js''). Funciona como una especie de proxy. Cuando estamos en una PWA y realizamos una petición, esta es interceptada por el service worker quien, dependiendo de las condiciones indicadas, obtiene los recursos desde local (caché) o los solicita a Internet.
navigator.serviceWorker.register("/sw.js")
El service worker corre en un hilo separado de la aplicación web, de forma que aunque cerremos la aplicación web, el service worker seguirá funcionando.
Ciclo de vida:
* Instalando: se descarga el fichero JavaScript y se "parsea"
* Instalado:
* Activación: código que se puede ejecutar antes de que se active el Service Worker
* Activado: el service worker toma control de la aplicación.
* Ocioso: el service work falla en la instalación o es sustituido por versiones nuevas. Ya no tiene control de la aplicación
==== Manifest ====
Archivo JSON que indica la apariencia que tendrá la aplicación cuando esté en el Home Screen del teléfono.
==== indexedDB ====
Permite grabar información en base de datos aunque el usuario no tenga conexión en ese momento.
==== Push Server ====
Permite enviar notificaciones push a la PWA.