# Guía de integración avanzada del SDK de iOS

import { Badge } from '@astrojs/starlight/components';

Esta sección proporciona información sobre la integración avanzada del SDK de Pushwoosh para iOS.

## Modos de segundo plano

<Aside type="caution" title="">
Por defecto, iOS no permite que las aplicaciones procesen notificaciones push cuando están en segundo plano. Esto incluye las notificaciones push silenciosas, que son útiles para actualizar los datos de la aplicación sin la interacción del usuario.
</Aside>

Para habilitar esta funcionalidad, debe agregar los Modos de Segundo Plano (Background Modes) a su proyecto.


#### Pasos para habilitar los modos de segundo plano

1. Abra su proyecto en **Xcode** y selecciónelo en el **Navegador de Proyectos (Project Navigator)**.
2. Elija el target de su aplicación en el panel izquierdo.
3. Vaya a la pestaña **Signing & Capabilities**.
4. Haga clic en el botón **+ Capability** en la esquina superior izquierda.
5. Busque y seleccione **Background Modes** en la lista.
6. En la sección **Background Modes**, habilite **Remote notifications** marcando la casilla.

Una vez completado, su aplicación podrá manejar notificaciones push, incluidas las silenciosas, mientras se ejecuta en segundo plano.

## Modos de primer plano

Por defecto, el SDK de Pushwoosh para iOS muestra el banner de notificación cuando la aplicación se está ejecutando en primer plano.

Puede controlar este comportamiento estableciendo la siguiente bandera booleana en su código (es decir, en su `AppDelegate`):

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    // Set false to disable foreground notifications, true to enable it
    Pushwoosh.sharedInstance().showPushnotificationAlert = true
    ```

    <LinkCard
        title="Ejemplo (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/ViewController.swift#L30"
    />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  // Set 0 to disable foreground notifications, 1 to enable it
  [[Pushwoosh sharedInstance] setShowPushnotificationAlert:0];
  ```

    <LinkCard
        title="Ejemplo (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/ViewController.m#L35"
    />

  </TabItem>
</Tabs>

## Nivel de registro

El SDK de Pushwoosh para iOS admite los siguientes niveles de registro:

- `NONE` - Sin registros del SDK.
- `ERROR` - Muestra solo mensajes de error en la consola.
- `WARNING` - Muestra advertencias además de errores.
- `INFO` - Incluye mensajes informativos (configuración predeterminada).
- `DEBUG` - Incluye información detallada de depuración.

Por defecto, el nivel de registro está establecido en INFO, lo que garantiza que el SDK proporcione información relevante sin saturar la consola del desarrollador.

Para modificar el nivel de registro, actualice la clave `Pushwoosh_LOG_LEVEL` en el archivo `Info.plist` de su aplicación:

```xml
<key>Pushwoosh_LOG_LEVEL</key>
<string>YOUR_LOG_LEVEL</string>
```

Alternativamente, puede cambiar el nivel de registro utilizando el siguiente fragmento de código:

```swift
Pushwoosh.Debug.setLogLevel(.PW_LL_DEBUG)
```

Reemplace `YOUR_LOG_LEVEL` con el nivel deseado (por ejemplo, `DEBUG` o `ERROR`).

## `UNNotificationCenterDelegate` personalizado

Si desea utilizar su propio `UNNotificationCenterDelegate` (por ejemplo, para notificaciones locales), debe informar al SDK de Pushwoosh sobre ello para un comportamiento adecuado. Puede hacerlo con la propiedad `notificationCenterDelegateProxy` de la instancia de Pushwoosh:

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    Pushwoosh.sharedInstance().notificationCenterDelegateProxy?.add(my_delegate)
    ```

    <LinkCard
        title="Ejemplo (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift#L23"
    />

    </TabItem>

    <TabItem label="Objective-C">
    ```objective-c
    [Pushwoosh.sharedInstance.notificationCenterDelegateProxy addNotificationCenterDelegate:my_delegate];
    ```

    <LinkCard
        title="Ejemplo (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m#L28"
    />

    </TabItem>
</Tabs>

Luego, implemente los métodos de `UNNotificationCenterDelegate` en su delegado:

<Tabs syncKey="code-example">
  <TabItem label="Swift">

  ```swift
  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      willPresent notification: UNNotification,
      withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(notification.request.content.userInfo)) {
          // Handle your notification
          completionHandler(UNNotificationPresentationOptions.alert)
      }
  }

  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      didReceive response: UNNotificationResponse,
      withCompletionHandler completionHandler: @escaping () -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(response.notification.request.content.userInfo)) {
          // Handle your notification
          completionHandler()
      }
  }
  ```

  <LinkCard title="Ejemplo (Swift)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift" />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  - (void)userNotificationCenter:(UNNotificationCenter *)center
          willPresentNotification:(UNNotification *)notification
          withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
      if (![PWMessage isPushwooshMessage:notification.request.content.userInfo]) {
          // Handle your message
          completionHandler(UNNotificationPresentationOptionAlert);
      }
  }

  - (void)userNotificationCenter:(UNNotificationCenter *)center
          didReceiveNotificationResponse:(UNNotificationResponse *)response
          withCompletionHandler:(void (^)(void))completionHandler {
      if (![PWMessage.isPushwooshMessage:response.notification.request.content.userInfo]) {
          // Handle your message
          completionHandler();
      }
  }
  ```

  <LinkCard title="Ejemplo (Objective-C)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m" />

  </TabItem>
</Tabs>

## Inicialización diferida de Pushwoosh

La bandera ```Pushwoosh_LAZY_INITIALIZATION``` evita la inicialización automática del SDK de Pushwoosh cuando se inicia la aplicación. Esto permite un mayor control sobre cuándo se inician los servicios del SDK de Pushwoosh.

Cuando esta bandera está habilitada, el SDK de Pushwoosh no inicia sus servicios hasta que se llaman explícitamente los métodos del SDK de Pushwoosh para iOS.

Agregue la siguiente entrada a Info.plist:

```xml
<key>Pushwoosh_LAZY_INITIALIZATION</key>
<true/>
```

**Casos de uso**
1. **Inicialización controlada del SDK** – La bandera Pushwoosh_LAZY_INITIALIZATION permite retrasar el inicio del SDK de Pushwoosh, lo que da más control sobre cuándo se activan los servicios push.

2. **Activación diferida de Push** – En algunas aplicaciones, las notificaciones push solo deben inicializarse bajo condiciones específicas. Habilitar esta bandera asegura que el SDK de Pushwoosh se inicie solo cuando se solicite explícitamente.

3. **Configuración de Push específica del usuario** – Algunas aplicaciones pueden requerir la personalización de la configuración de las notificaciones push según las preferencias del usuario o la configuración de la cuenta. Con la inicialización diferida, el SDK de Pushwoosh se inicia solo después de que se determina la configuración apropiada.
## Lista completa de propiedades de Info.plist

| Propiedad                                     | Descripción                                                                                              | Valores posibles                                                                                 |
|-----------------------------------------------|----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| `Pushwoosh_APPID`                             | Establece el ID de la aplicación Pushwoosh para la compilación de producción.                            | `XXXXX-XXXXX` <br /> **Tipo**: String                                                             |
| `Pushwoosh_APPID_Dev`                         | Establece el ID de la aplicación Pushwoosh para la compilación de desarrollo.                           | `XXXXX-XXXXX` <br /> **Tipo**: String                                                             |
| `Pushwoosh_SHOW_ALERT`                        | Muestra la alerta de notificación en primer plano.                                                       | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALERT_TYPE`                        | Establece el estilo de alerta de notificación.                                                           | `BANNER` *(predeterminado)* / `ALERT` / `NONE` <br /> **Tipo**: String                                   |
| `Pushwoosh_BASEURL`                           | Sobrescribe la URL base del servidor de Pushwoosh.                                                       | [`https://cp.pushwoosh.com/json/1.3/`](https://cp.pushwoosh.com/json/1.3/) *(predeterminado)* <br /> **Tipo**: String |
| `Pushwoosh_AUTO_ACCEPT_DEEP_LINK_FOR_SILENT_PUSH` | Si es `YES`, los Deep Links recibidos en pushes silenciosos se procesarán automáticamente.               | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_SERVER_COMMUNICATION`        | Permite al SDK enviar solicitudes de red a los servidores de Pushwoosh.                                  | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_DATA`      | Permite al SDK recopilar y enviar datos del dispositivo (versión del SO, configuración regional y modelo) al servidor. | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_OS_VERSION` | Permite al SDK recopilar y enviar la versión del SO del dispositivo al servidor.                         | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_LOCALE`    | Permite al SDK recopilar y enviar la configuración regional del dispositivo al servidor.                   | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_MODEL`     | Permite al SDK recopilar y enviar el modelo del dispositivo al servidor.                                   | `YES` *(predeterminado)* / `NO` <br /> **Tipo**: Boolean                                                 |
| `Pushwoosh_LOG_LEVEL`                         | Nivel de registro del SDK de Pushwoosh. Para más detalles, consulte [Control del nivel de registro](#nivel-de-registro). | `NONE` / `ERROR` / `WARNING` / `INFO` *(predeterminado)* / `DEBUG` / `VERBOSE` <br /> **Tipo**: String    |
| `Pushwoosh_PURCHASE_TRACKING_ENABLED`         | Permite al SDK rastrear las compras dentro de la aplicación. Necesario para el Customer Journey Builder.   | `YES` / `NO` *(predeterminado)* <br /> **Tipo**: Boolean                                                 |