# Транспорт gRPC

Модуль `PushwooshGRPC` предоставляет опциональный транспортный уровень gRPC, который может улучшить производительность сети при обмене данными с серверами Pushwoosh. При наличии, SDK автоматически использует gRPC для поддерживаемых методов API и переключается на REST, если gRPC недоступен.

<Aside type="note">
Доступно начиная с **SDK версии 7.0.18**.
</Aside>

## Как это работает

По умолчанию Pushwoosh SDK обменивается данными с серверами, используя REST API через HTTPS. Модуль `PushwooshGRPC` добавляет альтернативный транспорт gRPC, который предлагает несколько преимуществ:

- **Меньшая задержка** — gRPC использует HTTP/2 с постоянными соединениями
- **Меньший размер полезной нагрузки** — Protocol Buffers более компактны, чем JSON
- **Мультиплексирование** — несколько запросов могут быть отправлены по одному соединению

### Автоматический переход на резервный вариант

Модуль имеет встроенную отказоустойчивость:

| Сценарий | Поведение |
|----------|----------|
| gRPC доступен | Используется транспорт gRPC |
| gRPC недоступен | Переход на REST |
| Сетевая ошибка | Повторная попытка с использованием REST |

<Aside type="tip">
Вам не нужно обрабатывать выбор транспорта в вашем коде. SDK автоматически выбирает лучший доступный транспорт.
</Aside>

## Требования

| Требование | Версия |
|-------------|---------|
| iOS | 13.0+ |
| Xcode | 14.0+ |
| Swift | 5.0+ |

## Установка

### Swift Package Manager

Добавьте `PushwooshGRPC` в ваш таргет при интеграции Pushwoosh SDK:

1. В Xcode перейдите в **File → Add Package Dependencies**
2. Введите URL пакета: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. Выберите `PushwooshGRPC` в дополнение к обязательным фреймворкам

<Tabs>
<TabItem label="Обязательные фреймворки">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="Опциональные фреймворки">
* `PushwooshGRPC` — транспорт gRPC
* `PushwooshKeychain` — постоянный ID устройства
* `PushwooshLiveActivities` — поддержка Live Activities
* `PushwooshVoIP` — VoIP push-уведомления
* `PushwooshForegroundPush` — кастомные уведомления на переднем плане
</TabItem>
</Tabs>

### CocoaPods

Добавьте subspec gRPC в ваш `Podfile`:

```ruby
target 'MyApp' do
  use_frameworks!

  pod 'PushwooshXCFramework'
  pod 'PushwooshXCFramework/PushwooshGRPC'
end
```

Затем выполните:

```bash
pod install
```

## Использование

**Изменения в коде не требуются.** После добавления модуля `PushwooshGRPC` в ваш проект, он начинает работать автоматически:

1. При запуске приложения SDK определяет, что транспорт gRPC доступен
2. Вызовы API по возможности направляются через gRPC
3. Если gRPC не срабатывает, SDK автоматически переключается на REST

## Поддерживаемые методы

Следующие методы API поддерживают транспорт gRPC:

| Метод | Поддержка gRPC |
|--------|--------------|
| Регистрация устройства | Да |
| Теги (установка/получение) | Да |
| Отслеживание открытия приложения | Да |
| Статистика по пушам | Да |

<Aside type="note">
Методы, не перечисленные выше, продолжат использовать транспорт REST. SDK обрабатывает это прозрачно.
</Aside>

## Сценарии использования

Модуль `PushwooshGRPC` особенно полезен для:

- **Высокочастотного отслеживания событий** — снижение накладных расходов для приложений, отправляющих много событий
- **Приложений реального времени** — меньшая задержка для операций, чувствительных ко времени
- **Сред с ограниченной пропускной способностью** — меньшие размеры полезной нагрузки экономят данные

## Устранение неполадок

### Проверка активности модуля

Проверьте логи в консоли Xcode при запуске вашего приложения. Вы должны увидеть лог-сообщение, подобное этому:

```
[Pushwoosh] gRPC transport: ENABLED
```

### Принудительное использование REST-транспорта

Если вам нужно временно отключить gRPC для отладки, вы можете удалить модуль `PushwooshGRPC` из вашего таргета. SDK автоматически будет использовать транспорт REST, когда gRPC недоступен.

<Aside type="caution">
Не включайте в ваше приложение код для транспорта gRPC и REST одновременно — SDK автоматически обрабатывает выбор транспорта в зависимости от доступности модуля.
</Aside>