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

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

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

## 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 iOS de Pushwoosh muestra el banner de notificación cuando la aplicación se está ejecutando en primer plano.

Puede controlar este comportamiento estableciendo el siguiente flag booleano en su código (es decir, en su `AppDelegate`):

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    // Establezca false para deshabilitar las notificaciones en primer plano, true para habilitarlas
    Pushwoosh.configure.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
  // Establezca 0 para deshabilitar las notificaciones en primer plano, 1 para habilitarlas
  [[Pushwoosh configure] 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 iOS de Pushwoosh soporta 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 por defecto).
- `DEBUG` - Incluye información detallada de depuración.

Por defecto, el nivel de registro está establecido en INFO, asegurando 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 usando 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 el método `addNotificationCenterDelegate`:

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    Pushwoosh.configure.addNotificationCenterDelegate(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.configure 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)) {
          // Maneje su notificación
          completionHandler(UNNotificationPresentationOptions.alert)
      }
  }

  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      didReceive response: UNNotificationResponse,
      withCompletionHandler completionHandler: @escaping () -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(response.notification.request.content.userInfo)) {
          // Maneje su notificación
          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]) {
          // Maneje su mensaje
          completionHandler(UNNotificationPresentationOptionAlert);
      }
  }

  - (void)userNotificationCenter:(UNNotificationCenter *)center
          didReceiveNotificationResponse:(UNNotificationResponse *)response
          withCompletionHandler:(void (^)(void))completionHandler {
      if (![PWMessage.isPushwooshMessage:response.notification.request.content.userInfo]) {
          // Maneje su mensaje
          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

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

Cuando este flag está habilitado, el SDK de Pushwoosh no inicia sus servicios hasta que los métodos del SDK de iOS de Pushwoosh son llamados explícitamente.

Agregue la siguiente entrada a Info.plist:

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

**Casos de uso**
1. **Inicialización controlada del SDK** – El flag Pushwoosh_LAZY_INITIALIZATION permite retrasar el inicio del SDK de Pushwoosh, dando 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 este flag 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 en función de 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` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `Pushwoosh_ALERT_TYPE`                        | Establece el estilo de alerta de notificación.                                          | `BANNER` *(por defecto)* / `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/) *(por defecto)* <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` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `Pushwoosh_ALLOW_SERVER_COMMUNICATION`        | Permite al SDK enviar solicitudes de red a los servidores de Pushwoosh.               | `YES` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_DATA`      | Permite al SDK recopilar y enviar datos del dispositivo (versión del SO, locale y modelo) al servidor. | `YES` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_OS_VERSION` | Permite al SDK recopilar y enviar la versión del SO del dispositivo al servidor.   | `YES` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_LOCALE`    | Permite al SDK recopilar y enviar el locale del dispositivo al servidor.         | `YES` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_MODEL`     | Permite al SDK recopilar y enviar el modelo del dispositivo al servidor.          | `YES` *(por defecto)* / `NO` <br /> **Tipo**: Booleano                                                 |
| `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` *(por defecto)* / `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` *(por defecto)* <br /> **Tipo**: Booleano                                                 |