Ionic + Capacitor

SDK oficial @daertech/pushhub-capacitor sobre @capacitor/push-notifications, o integración por REST.

El SDK oficial @daertech/pushhub-capacitor (Capacitor 8 o superior) se apoya en @capacitor/push-notifications y agrega lo que ese plugin no hace:

  • registro del dispositivo con cola sin conexión;
  • detección del entorno de iOS (sandbox o production);
  • canal de Android;
  • notificaciones con la app abierta, con botones;
  • aperturas y clics reportados;
  • usuarios, tags y topics.

Instalación

npm install @daertech/pushhub-capacitor @capacitor/push-notifications @capacitor/local-notifications
npx cap sync

@capacitor/local-notifications es opcional: sin él, en Android las notificaciones que llegan con la app abierta no se muestran, aunque sí se reportan y llegan a onNotificationReceived.

  • Android: copia google-services.json en android/app/.
  • iOS: activa Push Notifications y Background Modes > Remote notifications en Xcode.

Muestra la notificación con la app abierta en iOS desde capacitor.config:

{ "plugins": { "PushNotifications": { "presentationOptions": ["badge", "sound", "alert"] } } }

Uso

import { PushHub } from '@daertech/pushhub-capacitor';

await PushHub.init({
  appKey: 'pk_live_TU_LLAVE_PUBLICA',      // solo la llave PUBLICA
  environment: 'auto',                      // iOS: lo detecta el SDK
  androidChannel: { id: 'general', name: 'Avisos generales' },
});

// Pide el permiso cuando el usuario entienda para qué (no al abrir la app)
const estado = await PushHub.requestPermission();   // 'granted' | 'denied' | ...

PushHub.identify('cliente-123');           // al iniciar sesión
PushHub.setTags({ plan: 'gold', ciudad: 'SDQ' });
PushHub.subscribe('ofertas');

PushHub.onNotificationOpened((n) => {
  // n.deepLink, n.actionId (botón tocado), n.data (tus datos)
  if (n.deepLink) router.navigateByUrl(new URL(n.deepLink).pathname);
});

PushHub.logout();                          // al cerrar sesión

Registra onNotificationOpened al iniciar la app: si la app se abrió desde una notificación, el SDK guarda esa apertura y la entrega en cuanto te suscribes.

Las llamadas (identify, setTags, subscribe) no esperan red: se guardan en una cola persistente. Se envían en cuanto hay token y conexión, y se reintentan con espera creciente.

Opciones de init

Opción Por defecto Descripción
appKey — Llave pública pk_live_… o pk_test_…. El SDK rechaza llaves secretas.
appId — Solo si la llave no está limitada a una app.
environment auto sandbox o production para forzarlo en iOS.
autoRegister false Pedir el permiso al iniciar.
foregroundDisplay true Mostrar las notificaciones con la app abierta.
androidChannel — Canal que el SDK crea; debe coincidir con el canal por defecto de la app en PushHub.
iosNotificationServiceExtension false Indica que la app incluye la extensión (ver abajo); habilita imágenes y botones en iOS.
apiUrl https://api.pushhub.daertec.com Solo para pruebas.
debug false Logs en la consola.

Dispositivo de prueba

En Dispositivos, el panel muestra un código de emparejamiento de 6 dígitos; en la app:

await PushHub.pairTestDevice('483920');

Imágenes y botones en iOS

iOS solo muestra multimedia y botones si la app incluye una Notification Service Extension. El SDK trae una lista para usar:

  1. En Xcode (ios/App): File > New > Target > Notification Service Extension.
  2. Reemplaza el NotificationService.swift generado por node_modules/@daertech/pushhub-capacitor/ios/NotificationService/NotificationService.swift.
  3. Inicia el SDK con iosNotificationServiceExtension: true.

En Android, las imágenes y los botones funcionan sin pasos extra.

Lo que el SDK reporta

Evento Cuándo
received La notificación llega con la app abierta.
opened El usuario toca la notificación.
clicked El usuario toca un botón (incluye actionId).
permission_granted / permission_denied Cambia el permiso.

Los ves en el detalle de cada envío y en el estado de integración de la app.

Sin SDK (REST)

Si usas otro plugin, registra el token tú mismo con POST /v1/devices:

await fetch('https://api.pushhub.daertec.com/v1/devices', {
  method: 'POST',
  headers: { Authorization: 'Bearer pk_live_TU_LLAVE_PUBLICA', 'Content-Type': 'application/json' },
  body: JSON.stringify({ token, platform: Capacitor.getPlatform(), environment: 'auto', framework: 'capacitor' }),
});

El id del envío llega en data._phid y el enlace en data.deepLink. Repórtalo a /v1/events al abrir.