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.jsonenandroid/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:
- En Xcode (
ios/App): File > New > Target > Notification Service Extension. - Reemplaza el
NotificationService.swiftgenerado pornode_modules/@daertech/pushhub-capacitor/ios/NotificationService/NotificationService.swift. - 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.