# Transporte gRPC

O módulo `PushwooshGRPC` fornece uma camada de transporte gRPC opcional que pode melhorar o desempenho da rede para comunicação com os servidores Pushwoosh. Quando disponível, o SDK usa automaticamente o gRPC para os métodos de API suportados e recorre ao REST se o gRPC não estiver disponível.

<Aside type="note">
Disponível a partir da **versão 7.0.18 do SDK**.
</Aside>

## Como funciona

Por padrão, o SDK da Pushwoosh se comunica com os servidores usando a API REST sobre HTTPS. O módulo `PushwooshGRPC` adiciona um transporte gRPC alternativo que oferece várias vantagens:

- **Menor latência** — o gRPC usa HTTP/2 com conexões persistentes
- **Tamanho de payload menor** — os Protocol Buffers são mais compactos que o JSON
- **Multiplexação** — várias solicitações podem ser enviadas por uma única conexão

### Fallback automático

O módulo inclui resiliência integrada:

| Cenário | Comportamento |
|----------|----------|
| gRPC disponível | Usa o transporte gRPC |
| gRPC indisponível | Recorre ao REST |
| Erro de rede | Tenta novamente com REST |

<Aside type="tip">
Você não precisa lidar com a seleção de transporte no seu código. O SDK escolhe automaticamente o melhor transporte disponível.
</Aside>

## Requisitos

| Requisito | Versão |
|-------------|---------|
| iOS | 13.0+ |
| Xcode | 14.0+ |
| Swift | 5.0+ |

## Instalação

### Swift Package Manager

Adicione `PushwooshGRPC` ao seu target ao integrar o SDK da Pushwoosh:

1. No Xcode, vá para **File → Add Package Dependencies**
2. Insira a URL do pacote: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. Selecione `PushwooshGRPC` além dos frameworks necessários

<Tabs>
<TabItem label="Frameworks obrigatórios">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="Frameworks opcionais">
* `PushwooshGRPC` — transporte gRPC
* `PushwooshKeychain` — ID de dispositivo persistente
* `PushwooshLiveActivities` — Suporte a Live Activities
* `PushwooshVoIP` — Notificações push VoIP
* `PushwooshForegroundPush` — Notificações personalizadas em primeiro plano
</TabItem>
</Tabs>

### CocoaPods

Adicione o subspec gRPC ao seu `Podfile`:

```ruby
target 'MyApp' do
  use_frameworks!

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

Em seguida, execute:

```bash
pod install
```

## Uso

**Nenhuma alteração de código é necessária.** Depois de adicionar o módulo `PushwooshGRPC` ao seu projeto, ele funciona automaticamente:

1. No lançamento do aplicativo, o SDK detecta que o transporte gRPC está disponível
2. As chamadas de API são roteadas através do gRPC quando possível
3. Se o gRPC falhar, o SDK recorre automaticamente ao REST

## Métodos suportados

Os seguintes métodos de API suportam o transporte gRPC:

| Método | Suporte gRPC |
|--------|--------------|
| Registro de dispositivo | Sim |
| Tags (set/get) | Sim |
| Rastreamento de abertura de aplicativo | Sim |
| Estatísticas de push | Sim |

<Aside type="note">
Os métodos não listados acima continuarão a usar o transporte REST. O SDK lida com isso de forma transparente.
</Aside>

## Casos de uso

O módulo `PushwooshGRPC` é particularmente útil para:

- **Rastreamento de eventos de alta frequência** — Overhead reduzido para aplicativos que enviam muitos eventos
- **Aplicações em tempo real** — Menor latência para operações sensíveis ao tempo
- **Ambientes com largura de banda limitada** — Tamanhos de payload menores economizam dados

## Solução de problemas

### Verificando se o módulo está ativo

Verifique os logs do console do Xcode quando seu aplicativo for iniciado. Você deve ver uma mensagem de log como:

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

### Forçando o transporte REST

Se você precisar desativar o gRPC temporariamente para depuração, pode remover o módulo `PushwooshGRPC` do seu target. O SDK usará automaticamente o transporte REST quando o gRPC não estiver disponível.

<Aside type="caution">
Não inclua o código de transporte gRPC e REST em seu aplicativo — o SDK lida com a seleção de transporte automaticamente com base na disponibilidade do módulo.
</Aside>