# Configurar InboxKit con Swift Package Manager

*Disponible desde el SDK de iOS [7.0.40](https://github.com/Pushwoosh/pushwoosh-ios-sdk/releases/tag/7.0.40).*

InboxKit se distribuye como un producto de biblioteca separado dentro del paquete Swift `Pushwoosh-XCFramework`. Necesitas que el SDK principal ya esté integrado; si estás empezando desde cero, sigue primero la [Guía de integración básica](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/).

## Añadir el producto del paquete InboxKit

1\. Abre tu proyecto en Xcode y navega a los ajustes del proyecto → **Package Dependencies**, luego presiona el botón **+**.

2\. Introduce la siguiente URL del paquete:

```bash
https://github.com/Pushwoosh/Pushwoosh-XCFramework
```

3\. Configura la **Dependency Rule** como **Up to Next Major Version** con la última versión estable, luego haz clic en **Add Package**.

4\. En la pantalla de selección de paquetes, elige al menos los siguientes productos y añádelos a tu target principal de la aplicación:

- **PushwooshFramework** (requerido)
- **PushwooshCore** (requerido)
- **PushwooshBridge** (requerido)
- **PushwooshInboxKit** (el nuevo módulo)

<img src="/setting-up-pushwoosh-inboxkit-ios-spm-products.webp" alt="Diálogo de Xcode para elegir productos del paquete con PushwooshBridge, PushwooshCore, PushwooshFramework y PushwooshInboxKit añadidos al target MyApp" width="640" style="display: block; margin: 0 auto;"/>

<p style="text-align: center; opacity: 0.7; font-size: 0.875rem; margin-top: 0.5rem;">Añade los cuatro productos resaltados a tu target principal de la aplicación.</p>

5\. Abre tu target principal de la aplicación y en **Frameworks, Libraries, and Embedded Content**, confirma que `PushwooshInboxKit.xcframework` esté listado e incrustado.

Eso es todo — InboxKit ahora está enlazado junto con el SDK principal.

## Mostrar la bandeja de entrada

Añade el controlador de la bandeja de entrada a cualquier flujo de navegación. La configuración por defecto es suficiente para obtener una bandeja de entrada funcional con los tres tipos de celdas estándar:

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
import PushwooshInboxKit

let inboxVC = PushwooshInboxKitViewController()
navigationController?.pushViewController(inboxVC, animated: true)
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
@import PushwooshInboxKit;

PushwooshInboxKitViewController *inboxVC = [PushwooshInboxKitViewController new];
[self.navigationController pushViewController:inboxVC animated:YES];
```
</TabItem>
</Tabs>

## Personalizar la bandeja de entrada

En Swift, configura el controlador a través del tipo de valor `PushwooshInboxKitAttributes`. En Objective-C, utiliza los setters compatibles con `@objc` en el controlador — `PushwooshInboxKitAttributes` es una struct de Swift y no tiene puente (bridge) a Objective-C.

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
var attributes = PushwooshInboxKitAttributes()
attributes.pullToRefreshEnabled = true
attributes.swipeToDeleteEnabled = true
attributes.pinningEnabled = true
attributes.style.unreadBadgeColor = .systemBlue
attributes.style.titleFont = .systemFont(ofSize: 17, weight: .semibold)

let inboxVC = PushwooshInboxKitViewController(attributes: attributes)
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
PushwooshInboxKitViewController *inboxVC = [PushwooshInboxKitViewController new];
[inboxVC setBackgroundColor:[UIColor systemBackgroundColor]];
[inboxVC setEmptyMessage:@"You have no messages yet"];
```
</TabItem>
</Tabs>

La struct `Style` expone todos los colores, fuentes, radios de esquina y el formateador de fecha utilizados por las celdas por defecto. Cada valor es un color semántico de Apple por defecto, por lo que la bandeja de entrada reacciona automáticamente al modo oscuro del sistema.

<img src="/setting-up-pushwoosh-inboxkit-ios-custom.webp" alt="Feed de InboxKit con estilo personalizado con colores de marca aplicados al título y al indicador de no leído" width="280" style="display: block; margin: 0 auto;"/>

<p style="text-align: center; opacity: 0.7; font-size: 0.875rem; margin-top: 0.5rem;">Celda con leyenda y un tema personalizado aplicado a través de <code>PushwooshInboxKitAttributes.Style</code>.</p>

## Manejar toques y actualizaciones

Adopta el protocolo `PushwooshInboxKitDelegate` para reaccionar a las acciones del usuario y a los eventos de actualización. Cada método tiene una implementación por defecto, por lo que solo necesitas sobreescribir lo que necesites:

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
final class InboxCoordinator: NSObject, PushwooshInboxKitDelegate {
    func inboxKit(_ vc: PushwooshInboxKitViewController,
                  didSelect message: PWInboxMessageProtocol) -> Bool {
        // Devuelve true para permitir que el SDK abra la URL del mensaje o el richmedia.
        // Devuelve false si manejaste el toque por completo (p. ej., enrutando a una pantalla personalizada).
        return true
    }

    func inboxKit(_ vc: PushwooshInboxKitViewController,
                  didRefreshWith messages: [PWInboxMessageProtocol],
                  error: Error?) {
        // Muestra tu propio estado de vacío / error aquí si es necesario.
    }
}

inboxVC.delegate = inboxCoordinator
```
</TabItem>
</Tabs>

<Aside type="note" title="Persistencia">
Marcar como leído, marcar todo como leído, eliminar y borrar leídos persisten en el almacenamiento local de la bandeja de entrada de Pushwoosh antes de que se envíe la solicitud de red. El estado sobrevive a un reinicio del proceso incluso cuando el backend aún no ha reconocido el cambio.
</Aside>

## Próximos pasos

<LinkCard
  title="Referencia de la API de PushwooshInboxKit"
  description="Documentación DocC generada para cada tipo público."
  href="https://pushwoosh.github.io/pushwoosh-ios-sdk/PushwooshInboxKit/documentation/pushwooshinboxkit/"
/>