# Configurar InboxKit con CocoaPods

*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 subspec opcional del pod paraguas `PushwooshXCFramework`. 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 pod de InboxKit

1\. Abre tu `Podfile` y añade el subspec de InboxKit a tu target de la aplicación:

```ruby
target 'MyApp' do
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshXCFramework/PushwooshInboxKit'
end
```

2\. Ejecuta `pod install` desde el directorio de tu proyecto:

```bash
pod install
```

3\. Abre el archivo `.xcworkspace` generado. 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 tener 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 estructura de Swift y no se puentea.

<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 estructura `Style` expone todos los colores, fuentes, radios de esquina y el formateador de fecha utilizado 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 con un tema personalizado aplicado a través de <code>PushwooshInboxKitAttributes.Style</code>.</p>

## Manejar toques y actualizaciones

Adáptate a `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 has manejado el toque por completo (p. ej., redirigiendo 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>

El SDK incluye operaciones masivas como métodos `@objc` en el controlador, por lo que puedes conectarlos directamente a un `UIBarButtonItem`:

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
let markAll = UIBarButtonItem(
    image: UIImage(systemName: "checkmark.circle"),
    style: .plain,
    target: inboxVC,
    action: #selector(PushwooshInboxKitViewController.markAllAsRead)
)
let clearRead = UIBarButtonItem(
    image: UIImage(systemName: "trash"),
    style: .plain,
    target: inboxVC,
    action: #selector(PushwooshInboxKitViewController.clearReadMessages)
)
inboxVC.navigationItem.rightBarButtonItems = [clearRead, markAll]
```
</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/"
/>