# Настройка InboxKit с помощью CocoaPods

*Доступно с iOS SDK [7.0.40](https://github.com/Pushwoosh/pushwoosh-ios-sdk/releases/tag/7.0.40).*

InboxKit поставляется как опциональный subspec для основного pod'а `PushwooshXCFramework`. Вам необходимо, чтобы основной SDK уже был интегрирован; если вы начинаете с нуля, сначала следуйте [руководству по базовой интеграции](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk-7-0/basic-integration-guide/).

## Добавьте pod InboxKit

1. Откройте ваш `Podfile` и добавьте subspec InboxKit в target вашего приложения:

```ruby
target 'MyApp' do
  use_frameworks!

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

2. Выполните `pod install` из директории вашего проекта:

```bash
pod install
```

3. Откройте сгенерированный файл `.xcworkspace`. Теперь InboxKit подключен вместе с основным SDK.

## Отобразите папку «Входящие»

Добавьте контроллер входящих сообщений в любой навигационный поток. Конфигурации по умолчанию достаточно, чтобы получить работающую папку «Входящие» с тремя стандартными типами ячеек:

<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>

## Настройте папку «Входящие»

В Swift настройте контроллер через тип значения `PushwooshInboxKitAttributes`. В Objective-C используйте `@objc`-совместимые сеттеры на контроллере — `PushwooshInboxKitAttributes` является структурой Swift и не имеет моста в 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>

Структура `Style` предоставляет доступ ко всем цветам, шрифтам, радиусам скругления углов и формату даты, используемым ячейками по умолчанию. Каждое значение по умолчанию является семантическим цветом Apple, поэтому папка «Входящие» автоматически реагирует на темный режим системы.

<img src="/setting-up-pushwoosh-inboxkit-ios-custom.webp" alt="Кастомизированная лента InboxKit с примененными фирменными цветами к заголовку и индикатору непрочитанных сообщений" width="280" style="display: block; margin: 0 auto;"/>

<p style="text-align: center; opacity: 0.7; font-size: 0.875rem; margin-top: 0.5rem;">Ячейка с подписью и примененной пользовательской темой через <code>PushwooshInboxKitAttributes.Style</code>.</p>

## Обработка нажатий и обновлений

Реализуйте протокол `PushwooshInboxKitDelegate`, чтобы реагировать на действия пользователя и события обновления. У каждого метода есть реализация по умолчанию, поэтому вы переопределяете только то, что вам нужно:

<Tabs syncKey="code-example">
<TabItem label="Swift">
```swift
final class InboxCoordinator: NSObject, PushwooshInboxKitDelegate {
    func inboxKit(_ vc: PushwooshInboxKitViewController,
                  didSelect message: PWInboxMessageProtocol) -> Bool {
        // Верните true, чтобы позволить SDK открыть URL сообщения или richmedia.
        // Верните false, если вы полностью обработали нажатие (например, перенаправили на пользовательский экран).
        return true
    }

    func inboxKit(_ vc: PushwooshInboxKitViewController,
                  didRefreshWith messages: [PWInboxMessageProtocol],
                  error: Error?) {
        // При необходимости отобразите здесь собственное состояние пустого списка или ошибки.
    }
}

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

SDK предоставляет массовые операции в виде `@objc` методов на контроллере, так что вы можете напрямую привязать их к `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="Сохранение состояния">
Операции «отметить как прочитанное», «отметить все как прочитанное», «удалить» и «очистить прочитанные» сохраняются в локальном хранилище входящих сообщений Pushwoosh до отправки сетевого запроса. Состояние сохраняется после перезапуска процесса, даже если бэкенд еще не подтвердил изменение.
</Aside>

## Следующие шаги

<LinkCard
  title="Справочник по API PushwooshInboxKit"
  description="Сгенерированная DocC-документация для каждого публичного типа."
  href="https://pushwoosh.github.io/pushwoosh-ios-sdk/PushwooshInboxKit/documentation/pushwooshinboxkit/"
/>