# Configurar o InboxKit com CocoaPods

*Disponível desde o SDK do iOS [7.0.40](https://github.com/Pushwoosh/pushwoosh-ios-sdk/releases/tag/7.0.40).*

O InboxKit é fornecido como um subspec opcional do pod guarda-chuva `PushwooshXCFramework`. Você precisa que o SDK principal já esteja integrado; se estiver começando do zero, siga primeiro o [guia de integração básica](/pt/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/).

## Adicionar o pod do InboxKit

1. Abra seu `Podfile` e adicione o subspec do InboxKit ao seu alvo de aplicativo:

```ruby
target 'MyApp' do
  use_frameworks!

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

2. Execute `pod install` a partir do diretório do seu projeto:

```bash
pod install
```

3. Abra o arquivo `.xcworkspace` gerado. O InboxKit agora está vinculado junto com o SDK principal.

## Mostrar a caixa de entrada

Adicione o controlador da caixa de entrada a qualquer fluxo de navegação. A configuração padrão é suficiente para obter uma caixa de entrada funcional com os três tipos de célula padrão:

<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 a caixa de entrada

Em Swift, configure o controlador através do tipo de valor `PushwooshInboxKitAttributes`. Em Objective-C, use os setters amigáveis para `@objc` no controlador — `PushwooshInboxKitAttributes` é uma struct Swift e não possui ponte para 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>

A struct `Style` expõe todas as cores, fontes, raios de canto e o formatador de data usados pelas células padrão. Cada valor é uma cor semântica da Apple por padrão, então a caixa de entrada reage ao modo escuro do sistema automaticamente.

<img src="/setting-up-pushwoosh-inboxkit-ios-custom.webp" alt="Feed do InboxKit com estilo personalizado com cores da marca aplicadas ao título e ao indicador de não lido" width="280" style="display: block; margin: 0 auto;"/>

<p style="text-align: center; opacity: 0.7; font-size: 0.875rem; margin-top: 0.5rem;">Célula legendada com um tema personalizado aplicado através de <code>PushwooshInboxKitAttributes.Style</code>.</p>

## Lidar com toques e atualizações

Conforme-se ao `PushwooshInboxKitDelegate` para reagir a ações do usuário e eventos de atualização. Cada método tem uma implementação padrão, então você só sobrescreve o que precisa:

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
final class InboxCoordinator: NSObject, PushwooshInboxKitDelegate {
    func inboxKit(_ vc: PushwooshInboxKitViewController,
                  didSelect message: PWInboxMessageProtocol) -> Bool {
        // Retorne true para permitir que o SDK abra a URL da mensagem ou richmedia.
        // Retorne false se você lidou com o toque inteiramente (por exemplo, roteou para uma tela personalizada).
        return true
    }

    func inboxKit(_ vc: PushwooshInboxKitViewController,
                  didRefreshWith messages: [PWInboxMessageProtocol],
                  error: Error?) {
        // Mostre seu próprio estado de vazio / erro aqui, se necessário.
    }
}

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

O SDK fornece operações em massa como métodos `@objc` no controlador, para que você possa conectá-los diretamente a um `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="Persistência">
Marcar como lida, marcar todas como lidas, excluir e limpar lidas persistem no armazenamento local da caixa de entrada do Pushwoosh antes que a solicitação de rede seja enviada. O estado sobrevive a uma reinicialização do processo, mesmo quando o backend ainda não reconheceu a alteração.
</Aside>

## Próximos passos

<LinkCard
  title="Referência da API PushwooshInboxKit"
  description="Documentação DocC gerada para cada tipo público."
  href="https://pushwoosh.github.io/pushwoosh-ios-sdk/PushwooshInboxKit/documentation/pushwooshinboxkit/"
/>