# Настройка InboxKit с помощью Swift Package Manager

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

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

## Добавьте пакетный продукт InboxKit

1. Откройте ваш проект в Xcode и перейдите в настройки проекта → **Package Dependencies**, затем нажмите кнопку **+**.

2. Введите следующий URL пакета (Package URL):

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

3. Установите правило зависимости (**Dependency Rule**) на **Up to Next Major Version** с последней стабильной версией, затем нажмите **Add Package**.

4. На экране выбора пакетов выберите как минимум следующие продукты и добавьте их в вашу основную цель приложения (main app target):

- **PushwooshFramework** (обязательно)
- **PushwooshCore** (обязательно)
- **PushwooshBridge** (обязательно)
- **PushwooshInboxKit** (новый модуль)

<img src="/setting-up-pushwoosh-inboxkit-ios-spm-products.webp" alt="Диалоговое окно Xcode Choose Package Products с добавленными PushwooshBridge, PushwooshCore, PushwooshFramework и PushwooshInboxKit в цель 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;">Добавьте четыре выделенных продукта в вашу основную цель приложения.</p>

5. Откройте вашу основную цель приложения и в разделе **Frameworks, Libraries, and Embedded Content** убедитесь, что `PushwooshInboxKit.xcframework` указан и встроен.

Вот и все — 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 сообщения или rich media.
        // Верните false, если вы полностью обработали нажатие (например, перенаправили на пользовательский экран).
        return true
    }

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

inboxVC.delegate = inboxCoordinator
```
</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/"
/>