# Guía de integración básica del SDK de Cordova

Esta sección contiene información sobre cómo integrar el SDK de Cordova de Pushwoosh en su aplicación.

## Prerrequisitos

Para integrar el SDK de Cordova de Pushwoosh en su aplicación, necesitará lo siguiente:

<Aside type="note" title="Requisitos">
 - Una [cuenta de Pushwoosh](https://sso.pushwoosh.com/login).
 - Un [proyecto de Pushwoosh](/es/product/first-steps/start-with-your-project/create-your-project) configurado en su cuenta.
 - **Para la integración con iOS:**
    - Una plataforma iOS configurada para enviar notificaciones push. Recomendamos usar la [configuración de Autenticación Basada en Token](/es/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/) como el enfoque más simple.
    - Establezca el Gateway en `Sandbox` para enviar pushes a un simulador.
 - **Para la integración con Android:**
    - Una [plataforma Android configurada](/es/developer/first-steps/connect-messaging-services/android-configuration/android-firebase-configuration)
    - El archivo `google-services.json` y el `package name` de su proyecto de Firebase.
    - Un proyecto de Firebase conectado a su aplicación de Android. Siga la [guía de configuración de Firebase](https://firebase.google.com/docs/android/setup#manually_add_firebase) si es necesario.
 - Su `Código de Aplicación de Pushwoosh` y el [Token de API de Dispositivo de Pushwoosh](/es/developer/api-reference/api-access-token/#device-api-token) desde el Panel de Control de Pushwoosh para su aplicación.
</Aside>

## Pasos de integración

### 1. Añadir la dependencia del SDK de Cordova de Pushwoosh

Añada la dependencia del SDK de Cordova de Pushwoosh a su proyecto:

```bash
cordova plugin add pushwoosh-cordova-plugin
```

### 2. Inicialización del SDK de Cordova

En el componente raíz de su archivo `index.js`, añada el siguiente código dentro del manejador de eventos `deviceready`. Siga los pasos en el orden exacto:

```javascript title="index.js"
document.addEventListener('deviceready', function() {
    var pushwoosh = cordova.require("pushwoosh-cordova-plugin.PushNotification");

    // 1. Register notification callbacks before initialization
    document.addEventListener('push-receive', function(event) {
        var notification = event.notification;
        console.log("Push received: " + JSON.stringify(notification));
    });

    document.addEventListener('push-notification', function(event) {
        var notification = event.notification;
        console.log("Push opened: " + JSON.stringify(notification));
    });

    // 2. Initialize Pushwoosh
    pushwoosh.onDeviceReady({
        appid: "__YOUR_APP_ID__"
    });

    // 3. Register the device to receive push notifications
    pushwoosh.registerDevice(
        function(status) {
            var pushToken = status.pushToken;
            // Handle successful registration
        },
        function(status) {
            // Handle registration error
        }
    );
}, false);
```

Donde:
- `__YOUR_APP_ID__` es el código de la aplicación del Panel de Control de Pushwoosh.

<Aside type="caution" title="El orden de inicialización es importante">
La secuencia de inicialización **debe** seguir el orden exacto que se muestra arriba:

1. **Registre primero los listeners de eventos** (`push-receive`, `push-notification`)
2. **Luego** llame a `onDeviceReady()`
3. **Luego** llame a `registerDevice()`

Cambiar este orden puede causar los siguientes problemas:

- **Listeners de eventos registrados después de `onDeviceReady()`:** Si la aplicación se inició al tocar una notificación push (arranque en frío), `onDeviceReady()` entrega inmediatamente la carga útil de la notificación de lanzamiento a JavaScript. Si sus listeners aún no están registrados en ese momento, **la notificación de lanzamiento se pierde** sin forma de recuperarla.
- **`registerDevice()` llamado antes de `onDeviceReady()`:** Es posible que el SDK nativo no esté configurado correctamente con su ID de aplicación todavía, lo que puede hacer que el registro del dispositivo falle silenciosamente o devuelva un error.
- **Listeners de eventos registrados después de `registerDevice()`:** Cualquier notificación push que llegue y se procese antes de que sus listeners estén en su lugar será despachada como un evento DOM y **descartada silenciosamente** ya que no hay un mecanismo de repetición en el plugin.

El plugin no encola ni almacena en búfer los eventos perdidos en el lado de JavaScript. Los eventos DOM disparados por `document.dispatchEvent()` se entregan solo a los listeners que ya están registrados en el momento del envío.
</Aside>


### 3. Configuración nativa de iOS

#### 3.1 Capacidades

Para habilitar las Notificaciones Push en su proyecto, necesita añadir ciertas capacidades.

En la sección Signing & Capabilities, añada las siguientes capacidades:
- `Push Notifications`
- `Background Modes`. Después de añadir esta capacidad, marque la casilla para `Remote notifications`.

Si tiene la intención de usar Notificaciones Sensibles al Tiempo (iOS 15+), añada también la capacidad de `Time Sensitive Notifications`.

#### 3.2 Info.plist

En su `Runner/Info.plist` establezca la clave `__PUSHWOOSH_DEVICE_API_TOKEN__` con el [Token de API de Dispositivo de Pushwoosh](/es/developer/api-reference/api-access-token/#device-api-token):
```swift title="info.plist"
<key>Pushwoosh_API_TOKEN</key>
<string>__PUSHWOOSH_DEVICE_API_TOKEN__</string>
```

#### 3.3 Seguimiento de la entrega de mensajes

Debe añadir un objetivo de Extensión de Servicio de Notificación a su proyecto. Esto es esencial para un seguimiento preciso de la entrega y para características como Rich Media en iOS.

Siga los [pasos de la guía nativa](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#4-message-delivery-tracking) para añadir el objetivo de la extensión y el código de Pushwoosh necesario dentro de él.

### 4. Configuración nativa de Android

#### 4.1 Instalar dependencias

Asegúrese de que las dependencias y plugins requeridos se añadan a sus scripts de Gradle:

Añada el plugin de Gradle de Google Services a las dependencias de su `build.gradle` a nivel de proyecto:

```groovy title="android/build.gradle"
buildscript {
  dependencies {
    classpath 'com.google.gms:google-services:4.3.15'
  }
}
```

Aplique el plugin en su archivo `build.gradle` a nivel de aplicación:

```groovy title="app/build.gradle"
apply plugin: 'com.google.gms.google-services'
```

#### 4.2 Añadir archivo de configuración de Firebase

Coloque el archivo `google-services.json` en la carpeta `android/app` en el directorio de su proyecto.

#### 4.3 Añadir metadatos de Pushwoosh

En su `main/AndroidManifest.xml` añada el [Token de API de Dispositivo de Pushwoosh](/es/developer/api-reference/api-access-token/#device-api-token) dentro de la etiqueta `<application>`:

```xml title="AndroidManifest.xml"
<meta-data android:name="com.pushwoosh.apitoken" android:value="__YOUR_DEVICE_API_TOKEN__" />
```

> **Importante:** Asegúrese de dar al token acceso a la aplicación correcta en su Panel de Control de Pushwoosh. [Aprenda más](/es/developer/api-reference/api-access-token/#edit-token)

### 5. Ejecutar el proyecto

1. Compile y ejecute el proyecto.
2. Vaya al Panel de Control de Pushwoosh y [envíe una notificación push](/es/product/messaging-channels/push-notifications/send-push-notifications/one-time-push).
3. Debería ver la notificación en la aplicación.

## Integración extendida

En esta etapa, ya ha integrado el SDK y puede enviar y recibir notificaciones push. Ahora, exploremos la funcionalidad principal

### Listeners de eventos de notificación push

En el SDK de Pushwoosh hay dos listeners de eventos, diseñados para manejar notificaciones push:

- El evento `push-receive` se activa cuando se recibe una notificación push mientras la aplicación está en primer plano
- El evento `push-notification` se activa cuando un usuario abre una notificación

Estos listeners de eventos **deben** registrarse **antes** de llamar a `onDeviceReady()`, como se muestra en el [paso de inicialización anterior](#2-cordova-sdk-initialization). Puede personalizar la lógica del manejador para que se adapte a sus necesidades:

```javascript title="index.js"
// Register before onDeviceReady()
document.addEventListener('push-receive', function(event) {
    var message = event.notification.message;
    var payload = event.notification.userdata;
    console.log("Push received: " + message);
    // Add your custom logic here
});

document.addEventListener('push-notification', function(event) {
    var message = event.notification.message;
    var payload = event.notification.userdata;
    console.log("Push accepted: " + message);
    // Add your custom logic here (e.g., navigate to a specific screen)
});
```

### Configuración de usuario

Al centrarse en el comportamiento y las preferencias individuales de los usuarios, puede entregar contenido personalizado, lo que conduce a una mayor satisfacción y lealtad del usuario

```javascript
class Registration {
  afterUserLogin(user) {

    // Set user ID
    pushwoosh.setUserId(user.getId());
    
    // Setting additional user information as tags for Pushwoosh
    pushwoosh.setTags({
      "age": user.getAge(),
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }
}
```

### Etiquetas

Las etiquetas son pares clave-valor asignados a usuarios o dispositivos, que permiten la segmentación basada en atributos como preferencias o comportamiento, lo que permite la mensajería dirigida.

```javascript
class UpdateUser {
  afterUserUpdateProfile(user) {

    // Set list of favorite categories
    pushwoosh.setTags({
      "favorite_categories": user.getFavoriteCategoriesList()
    });
    
    // Set payment information
    pushwoosh.setTags({
      "is_subscribed": user.isSubscribed(),
      "payment_status": user.getPaymentStatus(),
      "billing_address": user.getBillingAddress()
    });
  }
}
```

### Eventos

Los eventos son acciones o sucesos específicos del usuario dentro de la aplicación que se pueden rastrear para analizar el comportamiento y activar los mensajes o acciones correspondientes

```javascript
class Registration {

  // Track login event
  afterUserLogin(user) {
    pushwoosh.postEvent("login", {
      "name": user.getName(),
      "last_login": user.getLastLoginDate()
    });
  }

  // Track purchase event
  afterUserPurchase(product) {
    pushwoosh.postEvent("purchase", {
      "product_id": product.getId(),
      "product_name": product.getName(),
      "price": product.getPrice(),
      "quantity": product.getQuantity()
    });
  }
}
```

## Solución de problemas

Si encuentra algún problema durante el proceso de integración, consulte la sección de [soporte y comunidad](/es/developer/pushwoosh-sdk/support-and-community).