Holograma de PWA para empresas: un móvil de cristal cian que se ensambla desde la web con un escudo azul flotante
Desarrollo WebSoftware / APIs

PWA para Empresas en Madrid: Instalación, Push y Offline

Codezone
Codezone Empresa de Desarrollo Web y Software a Medida

Una PWA para empresas es una aplicación web que se instala en el móvil o el ordenador, abre a pantalla completa, sigue funcionando sin conexión gracias a un service worker y envía notificaciones push, también en iPhone desde iOS 16.4. Para muchas empresas de Madrid sustituye a una app nativa en herramientas internas y portales de cliente. La planteamos dentro de nuestro desarrollo de apps móviles en Madrid.

Una app nativa obliga a pasar la revisión de cada tienda y a convivir con usuarios que nunca actualizan. Si la herramienta es interna o la usan clientes que llegan por un enlace, ese coste se paga en cada versión y retrasa correcciones que en la web saldrían en minutos.

Al terminar sabrás si tu caso cabe en una PWA o pide una app nativa, una decisión que encaja con la guía técnica para elegir entre app móvil y aplicación web.

Qué es una PWA para empresas

Una PWA (Progressive Web App) para empresas es una aplicación web que el navegador puede instalar como una app gracias a dos piezas estándar: un manifest en JSON que describe su identidad y su modo de pantalla, y un service worker que intercepta las peticiones de red. Se publica en tu dominio, sin tiendas, y se actualiza al recargar.

La diferencia con una web adaptada al móvil ya la cubre la comparativa entre app nativa y web responsive; aquí importa lo que la PWA añade encima.

Esfera holográfica cian anclada a un escudo azul por haces de luz, rodeada de cubos de cristal flotantes
El manifest da identidad a la app y el service worker controla la red.

Cómo funcionan el service worker y el manifest

El service worker es un script que el navegador ejecuta en un hilo aparte de la página, sin acceso al DOM, y que actúa como intermediario entre la aplicación y la red. Solo se registra en páginas servidas por HTTPS.

  • Manifest: declara nombre, iconos, URL de inicio y modo `standalone`. Chrome lo exige, junto con HTTPS, para ofrecer la instalación.
  • Evento install: guarda en caché los archivos que la app necesita para arrancar sin red.
  • Evento activate: borra las cachés de versiones anteriores para que nadie trabaje con código viejo.
  • Evento fetch: decide por tipo de recurso si responde desde la red o desde la caché.

La elección de estrategia por tipo de dato y la resolución de conflictos al reconectar siguen los mismos patrones del desarrollo offline-first con sincronización y caché.

PWA en iOS y Android: instalación y notificaciones push

Safari admite notificaciones push web desde iOS y iPadOS 16.4 en las web apps añadidas a la pantalla de inicio, según el anuncio de Web Push para web apps de WebKit de febrero de 2023.

  • iPhone y iPad: Instalación: el usuario la añade desde Safari con "Añadir a pantalla de inicio", así que tu web debe explicarle el gesto. Push: solo en la web app instalada, con el permiso pedido tras un toque del usuario y el manifest en modo `standalone` o `fullscreen`.
  • iOS 26: Instalación: toda web añadida a la pantalla de inicio abre como web app por defecto, como detalla la nota de WebKit sobre Safari 26. El usuario puede desactivarlo y dejarla como marcador.
  • Android: Instalación: Chrome ofrece instalar cuando la web cumple HTTPS y el manifest está completo.
Dos torres de cristal azul unidas por un arco de partículas cian del que caen ondas de luz hacia el suelo
Las notificaciones push llegan a ambas plataformas con el mismo estándar.

En el servidor, las colas de envío y la limpieza de suscripciones caducadas funcionan igual que en la arquitectura de notificaciones push en apps móviles.

Cuándo una PWA sustituye a una app nativa

Una PWA sustituye a una app nativa cuando el valor está en los datos y los procesos, y no en el hardware del teléfono ni en la presencia en tiendas.

  • Cuándo sí: herramientas internas, portales de cliente, reservas y catálogos B2B. También cuando el usuario llega por un enlace o un QR, o cuando publicas cambios cada semana.
  • Cuándo no: necesitas hardware que Safari no expone a la web, tareas continuas con la app cerrada o captar usuarios desde la App Store y Google Play, con sus reglas de publicación en App Store y Google Play.
  • Caso hipotético: imagina una empresa de mantenimiento de Madrid con 25 técnicos que rellenan partes en sótanos sin cobertura. Una PWA con caché local lo cubre sin tiendas.

Si el análisis apunta a nativa o multiplataforma, los criterios por sector están en cómo plantear apps móviles para empresas de Valencia. El contenido de la PWA puede venir de un CMS headless para tu web corporativa y sus altas de cliente, de formularios web que crean el lead en el CRM.

CodeZone Pro Tip: este service worker sirve las páginas desde la red con copia sin conexión, los archivos estáticos desde caché y muestra las notificaciones push que envía tu servidor.
// Cambia la versión en cada despliegue: activate borrará la caché anterior
const VERSION = "app-v12";
const PRECACHE = ["/", "/offline.html", "/app.css", "/app.js", "/icon-192.png"];

self.addEventListener("install", (event) => {
  event.waitUntil(caches.open(VERSION).then((c) => c.addAll(PRECACHE)));
  self.skipWaiting(); // la nueva versión toma el control sin esperar a cerrar pestañas
});

self.addEventListener("activate", (event) => {
  event.waitUntil(caches.keys().then((ks) => Promise.all(ks.filter((k) => k !== VERSION).map((k) => caches.delete(k)))));
  self.clients.claim();
});

self.addEventListener("fetch", (event) => {
  const req = event.request;
  if (req.method !== "GET") return; // los envíos de datos nunca se sirven desde caché
  // Páginas: red primero para no enseñar precios o stock antiguos.
  // Estáticos versionados: caché primero, ya que cambian de nombre en cada despliegue
  event.respondWith(req.mode === "navigate"
    ? fetch(req).catch(() => caches.match("/offline.html"))
    : caches.match(req).then((hit) => hit || fetch(req)));
});

self.addEventListener("push", (event) => {
  const data = event.data ? event.data.json() : { title: "Aviso", body: "", url: "/" };
  // Cada push muestra una notificación visible: no diseñes envíos silenciosos
  event.waitUntil(self.registration.showNotification(data.title, { body: data.body, icon: "/icon-192.png", data: { url: data.url } }));
});

self.addEventListener("notificationclick", (event) => {
  event.notification.close();
  event.waitUntil(self.clients.openWindow(event.notification.data.url));
});

Con este archivo, quien pierde la cobertura sigue viendo la app en lugar de un error, y cada despliegue llega a todos en la siguiente apertura, sin esperar a que actualicen.

Cámara acorazada holográfica de anillos azules que guarda bloques de luz cian mientras una tormenta de partículas cae fuera
La caché local mantiene la app operativa cuando cae la red.

Lo Que Pagas Si Eliges App Nativa por Inercia

Elegir nativa sin necesitarla multiplica el mantenimiento: dos plataformas que revisar en cada tienda y versiones antiguas activas durante meses. Una PWA bien diseñada concentra el presupuesto en el producto y deja la puerta abierta a una app nativa cuando un requisito real la justifique.

Bifurcación de dos caminos de luz sobre un suelo reflectante, uno cian que asciende y otro azul que se enreda en nudos
Decidir con requisitos evita mantener dos plataformas sin necesidad.

En Codezone analizamos tus procesos y te decimos qué parte cabe en una PWA y cuál necesita nativa. Cuéntanos qué app tienes en mente y te proponemos la arquitectura.