

# SDK de transmisión de IVS: intercambio de tokens \| Transmisión en tiempo real
<a name="broadcast-mobile-token-exchange"></a>

El intercambio de tokens le permite mejorar o reducir las capacidades de los tokens participantes y actualizar los atributos de los tokens en el SDK de transmisión, sin necesidad de que los participantes se vuelvan a conectar. Esto es útil en situaciones como el coalojamiento, en las que los participantes pueden comenzar con capacidades solo de suscripción y posteriormente necesitar capacidades de publicación.

El intercambio de tokens es compatible con los SDK de transmisión móvil y web. Cuando un participante intercambia un token, la composición del servidor detecta los atributos actualizados en tiempo real y ajusta automáticamente el diseño (por ejemplo, reasignando el espacio destacado, reordenando los participantes o moviendo a un participante a la superposición de imagen en imagen) sin necesidad de volver a conectarse. 

Limitación: el intercambio de tokens solo funciona con tokens creados en su servidor mediante un [par de claves](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/getting-started-distribute-tokens.html#getting-started-distribute-tokens-self-signed). No funciona con los tokens creados a través de la API [CreateParticipantToken](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html).

## Intercambio de tokens
<a name="broadcast-mobile-token-exchange-exchanging-tokens"></a>

El intercambio de tokens es sencillo: llame a la API `exchangeToken` del objeto `Stage` / `IVSStage` y proporciona el nuevo token. Si las `capabilities` del nuevo token son diferentes a las del token anterior, las capacidades del nuevo token se evalúan inmediatamente. Por ejemplo, si el token anterior no tenía la capacidad `publish` y el nuevo sí, se invocan las funciones de la estrategia de escenario para la publicación, lo que permite a la aplicación anfitriona decidir si quiere publicar de inmediato con la nueva capacidad o esperar. Lo mismo ocurre con las capacidades eliminadas: si el token anterior tenía la capacidad `publish` y el nuevo no, el participante anula de inmediato la publicación sin invocar las funciones de estrategia de la fase de publicación.

Al intercambiar un token, el token anterior y el nuevo deben tener los mismos valores para los siguientes campos de carga útil: 
+ `topic`
+ `resource`
+ `jti`
+ `whip_url`
+ `events_url`

Estos campos son inmutables. Si se intercambia un token que modifica un campo inmutable, el SDK rechaza de manera inmediata el intercambio.

Los campos restantes se pueden cambiar, incluidos:
+ `attributes`
+ `capabilities`
+ `user`
+ `_id`
+ `iat`
+ `exp`

### iOS
<a name="broadcast-mobile-token-exchange-exchanging-tokens-ios"></a>



```
let stage = try IVSStage(token: originalToken, strategy: self)
stage.join()
stage.exchangeToken(newToken)
```

### Android
<a name="broadcast-mobile-token-exchange-exchanging-tokens-android"></a>



```
val stage = Stage(context, originalToken, strategy)
stage.join()
stage.exchangeToken(newToken)
```

### Web
<a name="broadcast-web-token-exchange-exchanging-tokens"></a>



```
const stage = new Stage(originalToken, strategy);
await stage.join();
await stage.exchangeToken(newToken);
```

## Recepción de actualizaciones
<a name="broadcast-mobile-token-exchange-receiving-updates"></a>

Una función en `StageRenderer` / `IVSStageRenderer` recibe actualizaciones sobre los participantes remotos ya publicados que intercambian sus tokens para actualizar su `userId` o `attributes`. Los participantes remotos que aún no publiquen expondrán sus `userId` y `attributes` actualizados a través de las funciones de renderizado `onParticipantJoined` / `participantDidJoin` existentes si finalmente publican

### iOS
<a name="broadcast-mobile-token-exchange-receiving-updates-ios"></a>



```
class MyStageRenderer: NSObject, IVSStageRenderer {
    func stage(_ stage: IVSStage, participantMetadataDidUpdate participant: IVSParticipantInfo) {
        // participant will be a new IVSParticipantInfo instance with updated properties.
    }
}
```

### Android
<a name="broadcast-mobile-token-exchange-receiving-updates-android"></a>



```
private val stageRenderer = object : StageRenderer {
    override fun onParticipantMetadataUpdated(stage: Stage, participantInfo: ParticipantInfo) {
        // participantInfo will be a new ParticipantInfo instance with updated properties.
    }
}
```

### Web
<a name="broadcast-web-token-exchange-receiving-updates"></a>



```
stage.on(StageEvents.STAGE_PARTICIPANT_METADATA_CHANGED, (participantInfo: StageParticipantInfo) => { 
    // participantInfo properties will be updated with the changed properties 
    }
);
```

## Visibilidad de actualizaciones
<a name="broadcast-mobile-token-exchange-visibility"></a>

Cuando un participante intercambia un token para actualizar su `userId` o `attributes`, la visibilidad de estos cambios depende de su estado de publicación actual: 
+ **Si el participante *no* publica:** la actualización se procesa de forma silenciosa. Si finalmente se publican, todos los SDK recibirán la información actualizada de `userId` y `attributes` como parte del evento de publicación inicial.
+ **Si el participante ya *está* publicando:** la actualización se transmite inmediatamente para los participantes mediante los SDK móviles v1.37.0\+, el SDK web y la composición del servidor. Los participantes que utilizan los SDK móviles más antiguos no ven el cambio hasta que el participante anula la publicación y la vuelve a publicar.

Esta tabla aclara la matriz de soporte:


| Estado del participante | Observador: SDK móvil 1.37.0\+, SDK web, composición del servidor  | Observador: SDK móviles más antiguos | 
| --- | --- | --- | 
| No se publica (luego comienza) | ✅ Visible (al publicarse cuando el participante se haya unido al evento) | ✅ Visible (al publicarse cuando el participante se haya unido al evento) | 
| Ya publica (nunca vuelve a publicar) | ✅ Visible (inmediatamente a través del evento actualizado de los metadatos de los participantes) | ❌ No visible | 
| Ya publica (deja de publicar y vuelve a publicar) | ✅ Visible (inmediatamente a través del evento actualizado de los metadatos de los participantes) | ✅ Visible más adelante (cuando vuelve a publicar a través del evento de incorporación del participante) | 