

# IVS-Broadcast-SDK: Token-Austausch \| Echtzeit-Streaming
<a name="broadcast-mobile-token-exchange"></a>

Der Token-Austausch ermöglicht es Ihnen, die Funktionen von Teilnehmer-Tokens zu erweitern oder einzuschränken und Token-Attribute innerhalb des Broadcast-SDK zu aktualisieren, ohne dass die Teilnehmer erneut eine Verbindung herstellen müssen. Dies ist nützlich für Szenarien wie Co-Hosting, bei denen Teilnehmer zunächst nur über Subscribe-Funktionen verfügen und später Veröffentlichungsfunktionen benötigen.

Der Token-Austausch wird sowohl im SDK für mobile Anwendungen als auch im SDK für Web-Übertragungen unterstützt. Wenn ein Teilnehmer ein Token austauscht, erkennt die serverseitige Zusammensetzung die aktualisierten Attribute in Echtzeit und passt das Layout automatisch an – beispielsweise durch Neuzuweisung des hervorgehobenen Slots, Neuanordnung der Teilnehmer oder Verschieben eines Teilnehmers in die Bild-in-Bild-Überlagerung – ohne dass eine erneute Verbindung erforderlich ist. 

Einschränkung: Der Token-Austausch funktioniert nur mit Token, die auf Ihrem Server mit einem [Schlüsselpaar](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/getting-started-distribute-tokens.html#getting-started-distribute-tokens-self-signed) erstellt wurden. Er funktioniert nicht mit Token, die über die [CreateParticipantToken-API](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html) erstellt wurden.

## Teilnehmer-Token
<a name="broadcast-mobile-token-exchange-exchanging-tokens"></a>

Der Token-Austausch ist unkompliziert: Rufen Sie die `exchangeToken`-API für das `Stage`/`IVSStage`-Objekt auf und stellen Sie das neue Token bereit. Wenn sich die `capabilities` des neuen Tokens von denen des vorherigen Tokens unterscheiden, werden die Fähigkeiten des neuen Tokens sofort bewertet. Wenn das vorherige Token beispielsweise nicht über die Fähigkeit `publish` verfügte, das neue Token jedoch schon, werden die Stage-Strategy-Funktionen für die Veröffentlichung aufgerufen, sodass die Hostanwendung entscheiden kann, ob sie mit der neuen Funktion sofort veröffentlichen oder warten möchte. Das Gleiche gilt für entfernte Funktionen: Wenn das vorherige Token über die Fähigkeit `publish` verfügte und das neue Token nicht, macht der Teilnehmer die Veröffentlichung sofort rückgängig, ohne die Funktionen der Phasenstrategie für die Veröffentlichung aufzurufen.

Beim Token-Austausch müssen das vorherige und das neue Token dieselben Werte für die folgenden Nutzdaten-Felder haben: 
+ `topic`
+ `resource`
+ `jti`
+ `whip_url`
+ `events_url`

Diese Felder sind unveränderlich. Der Austausch eines Tokens, das ein unveränderliches Feld ändert, führt dazu, dass das SDK den Austausch sofort ablehnt.

Die übrigen Felder können geändert werden, darunter:
+ `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);
```

## Empfangen von Updates
<a name="broadcast-mobile-token-exchange-receiving-updates"></a>

Eine Funktion in `StageRenderer`/`IVSStageRenderer` empfängt Updates über bereits veröffentlichte Remote-Teilnehmer, die ihre Token austauschen, um ihre `userId` oder `attributes` zu aktualisieren. Fernteilnehmer, die noch nicht veröffentlichen, erhalten ihre `userId` und `attributes` aktualisiert und über die vorhandenen `onParticipantJoined`/`participantDidJoin`-Renderer-Funktionen angezeigt, wenn sie schließlich veröffentlichen.

### 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 
    }
);
```

## Sichtbarkeitsstatus
<a name="broadcast-mobile-token-exchange-visibility"></a>

Wenn ein Teilnehmer ein Token austauscht, um seine `userId` oder `attributes` zu aktualisieren, hängt die Sichtbarkeit dieser Änderungen von seinem aktuellen Veröffentlichungsstatus ab: 
+ **Wenn der Teilnehmer *nicht* veröffentlicht:** Die Aktualisierung wird im Hintergrund verarbeitet. Wenn er irgendwann veröffentlicht, erhalten alle SDKs die aktualisierte `userId` und `attributes` als Teil der ersten Veröffentlichung.
+ **Wenn der Teilnehmer *bereits* veröffentlicht:** Die Aktualisierung wird sofort an Teilnehmer übertragen, die mobile SDKs ab Version 1.37.0, das Web-SDK und die serverseitige Zusammensetzung verwenden. Teilnehmer, die ältere mobile SDKs verwenden, sehen die Änderung erst, wenn sie die Veröffentlichung rückgängig machen und erneut veröffentlichen.

In dieser Tabelle wird die Unterstützungsmatrix verdeutlicht:


| Teilnehmerstatus | Betrachter: Mobile SDK 1.37.0\+, Web-SDK, serverseitige Zusammensetzung  | Betrachter: Ältere mobile SDKs | 
| --- | --- | --- | 
| Wird nicht veröffentlicht (startet dann) | ✅ Sichtbar (bei Veröffentlichung über eine Veranstaltung, der ein Teilnehmer beigetreten ist) | ✅ Sichtbar (bei Veröffentlichung über eine Veranstaltung, der ein Teilnehmer beigetreten ist) | 
| Bereits veröffentlicht (wird nie erneut veröffentlicht) | ✅ Sichtbar (sofort über ein durch Metadaten der Teilnehmer aktualisiertes Ereignis) | ❌ Nicht sichtbar | 
| Bereits veröffentlicht (Veröffentlichung rückgängig gemacht und erneut veröffentlicht) | ✅ Sichtbar (sofort über ein durch Metadaten der Teilnehmer aktualisiertes Ereignis) | ⚠️ Letztendlich sichtbar (bei erneuten Veröffentlichung über eine Veranstaltung, der ein Teilnehmer beigetreten ist) | 