# Transporte gRPC

El módulo `PushwooshGRPC` proporciona una capa de transporte gRPC opcional que puede mejorar el rendimiento de la red para la comunicación con los servidores de Pushwoosh. Cuando está disponible, el SDK utiliza automáticamente gRPC para los métodos de API compatibles y recurre a REST si gRPC no está disponible.

<Aside type="note">
Disponible a partir de la **versión 7.0.18 del SDK**.
</Aside>

## Cómo funciona

Por defecto, el SDK de Pushwoosh se comunica con los servidores utilizando la API REST sobre HTTPS. El módulo `PushwooshGRPC` añade un transporte gRPC alternativo que ofrece varias ventajas:

- **Menor latencia** — gRPC utiliza HTTP/2 con conexiones persistentes
- **Tamaño de carga útil más pequeño** — Los Protocol Buffers son más compactos que JSON
- **Multiplexación** — Se pueden enviar múltiples solicitudes a través de una única conexión

### Recurso automático (fallback)

El módulo incluye resiliencia incorporada:

| Escenario | Comportamiento |
|----------|----------|
| gRPC disponible | Usa el transporte gRPC |
| gRPC no disponible | Recurre a REST |
| Error de red | Reintenta con REST |

<Aside type="tip">
No necesitas gestionar la selección del transporte en tu código. El SDK elige automáticamente el mejor transporte disponible.
</Aside>

## Requisitos

| Requisito | Versión |
|-------------|---------|
| iOS | 13.0+ |
| Xcode | 14.0+ |
| Swift | 5.0+ |

## Instalación

### Swift Package Manager

Añade `PushwooshGRPC` a tu objetivo (target) al integrar el SDK de Pushwoosh:

1. En Xcode, ve a **File → Add Package Dependencies**
2. Introduce la URL del paquete: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`
3. Selecciona `PushwooshGRPC` además de los frameworks requeridos

<Tabs>
<TabItem label="Frameworks requeridos">
* `PushwooshFramework`
* `PushwooshCore`
* `PushwooshBridge`
</TabItem>
<TabItem label="Frameworks opcionales">
* `PushwooshGRPC` — Transporte gRPC
* `PushwooshKeychain` — ID de dispositivo persistente
* `PushwooshLiveActivities` — Soporte para Live Activities
* `PushwooshVoIP` — Notificaciones push VoIP
* `PushwooshForegroundPush` — Notificaciones personalizadas en primer plano
</TabItem>
</Tabs>

### CocoaPods

Añade el subspec de gRPC a tu `Podfile`:

```ruby
target 'MyApp' do
  use_frameworks!

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

Luego ejecuta:

```bash
pod install
```

## Uso

**No se requieren cambios en el código.** Una vez que añades el módulo `PushwooshGRPC` a tu proyecto, funciona automáticamente:

1. En el lanzamiento de la aplicación, el SDK detecta que el transporte gRPC está disponible
2. Las llamadas a la API se enrutan a través de gRPC cuando es posible
3. Si gRPC falla, el SDK recurre automáticamente a REST

## Métodos compatibles

Los siguientes métodos de API son compatibles con el transporte gRPC:

| Método | Soporte gRPC |
|--------|--------------|
| Registro de dispositivo | Sí |
| Tags (set/get) | Sí |
| Seguimiento de apertura de la aplicación | Sí |
| Estadísticas de push | Sí |

<Aside type="note">
Los métodos no listados arriba continuarán usando el transporte REST. El SDK maneja esto de forma transparente.
</Aside>

## Casos de uso

El módulo `PushwooshGRPC` es particularmente útil para:

- **Seguimiento de eventos de alta frecuencia** — Sobrecarga reducida para aplicaciones que envían muchos eventos
- **Aplicaciones en tiempo real** — Menor latencia para operaciones sensibles al tiempo
- **Entornos con ancho de banda limitado** — Tamaños de carga útil más pequeños que ahorran datos

## Solución de problemas

### Verificar que el módulo está activo

Revisa los registros de la consola de Xcode cuando tu aplicación se inicie. Deberías ver un mensaje de registro como:

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

### Forzar el transporte REST

Si necesitas deshabilitar gRPC temporalmente para depuración, puedes eliminar el módulo `PushwooshGRPC` de tu objetivo (target). El SDK utilizará automáticamente el transporte REST cuando gRPC no esté disponible.

<Aside type="caution">
No incluyas código de transporte gRPC y REST en tu aplicación — el SDK gestiona la selección de transporte automáticamente según la disponibilidad del módulo.
</Aside>