

# IVS Broadcast SDK: トークン交換 \| リアルタイムストリーミング
<a name="broadcast-mobile-token-exchange"></a>

トークン交換を使用すると、参加者が再接続することなく、参加者トークン機能をアップグレードまたはダウングレードし、ブロードキャスト SDK 内のトークン属性を更新できます。これは、参加者がサブスクライブ専用機能から開始し、後でパブリッシュ機能が必要になる共同ホスティングなどのシナリオで便利です。

トークン交換は、Mobile Broadcast SDK と Web Broadcast SDK の両方でサポートされています。参加者がトークンを交換すると、サーバーサイドコンポジションは更新された属性 (注目のスロットの再割り当て、参加者の順序変更、ピクチャーインピクチャーオーバーレイへの参加者の移動など) をリアルタイムで検出し、レイアウトを自動的に調整します。再接続の必要はありません。

制限: トークン交換は、[キーペア](https://docs.aws.amazon.com//ivs/latest/RealTimeUserGuide/getting-started-distribute-tokens.html#getting-started-distribute-tokens-self-signed)を使用してサーバーで作成されたトークンでのみ機能します。[CreateParticipantToken API](https://docs.aws.amazon.com/ivs/latest/RealTimeAPIReference/API_CreateParticipantToken.html) を介して作成されたトークンでは機能しません。

## トークンの交換
<a name="broadcast-mobile-token-exchange-exchanging-tokens"></a>

トークンの交換は簡単です。`Stage` / `IVSStage` オブジェクト上の `exchangeToken` API を呼び出して新しいトークンを提供します。新しいトークンの `capabilities` が以前のトークンのものと異なる場合、新しいトークンの機能は直ちに評価されます。例えば、前のトークンに `publish` 機能がなく、新しいトークンにその機能がある場合、公開用のステージ戦略関数が呼び出され、ホストアプリケーションが新しい機能を使用してすぐに公開するか、待機するかを決定できるようになります。削除された機能も同様です。前のトークンに `publish` 機能があり、新しいトークンにその機能がない場合、参加者は公開用のステージ戦略関数を呼び出さずにすぐに公開を解除します。

トークンを交換する場合、以前のトークンと新しいトークンのペイロードフィールドの値が同じである必要があります。
+ `topic`
+ `resource`
+ `jti`
+ `whip_url`
+ `events_url`

これらのフィールドはイミュータブルです。イミュータブルなフィールドを変更するトークンを交換すると、SDK は直ちに交換を拒否します。

残りのフィールドは、次のように変更できます。
+ `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);
```

## 更新の受信
<a name="broadcast-mobile-token-exchange-receiving-updates"></a>

`StageRenderer` / `IVSStageRenderer` の関数は、`userId` または `attributes` を更新するトークンを交換する既に公開済みのリモート参加者に関する更新を受信します。まだ公開していないリモート参加者は、最終的に公開された場合、既存の `onParticipantJoined` / `participantDidJoin` レンダラー関数を介して更新済みの `userId` と `attributes` を持ちます

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

## 更新の可視性
<a name="broadcast-mobile-token-exchange-visibility"></a>

参加者がトークンを交換して `userId` または `attributes` を更新する場合、これらの変更の可視性は現在の公開状態によって異なります。
+ **参加者が公開**していない場合:** 更新はサイレントに処理されます。最終的に公開されると、すべての SDK は最初の公開イベントの一部として更新済みの `userId` と `attributes` を受け取ります。
+ **参加者が**既に公開している場合:** 更新は、モバイル SDK v1.37.0 以降、ウェブ SDK、およびサーバーサイドコンポジションを使用している参加者に対して直ちにブロードキャストされます。古いモバイル SDK を使用している参加者の場合、変更は、参加者が公開を解除して再公開するまで表示されません。

次の表はサポートのマトリックスを示します。


| 参加者の状態 | オブザーバー: Mobile SDK 1.37.0 以降、Web SDK、サーバーサイドコンポジション  | オブザーバー: 古い Mobile SDK | 
| --- | --- | --- | 
| 未発行 (その後開始) | ✅ 表示可能 (参加者が参加したイベントを通じて公開) | ✅ 表示可能 (参加者が参加したイベントを通じて公開) | 
| 発行済み (再発行なし) | ✅ 表示可能 (参加者メタデータ更新済みイベントを介して即時) | ❌ 表示不可 | 
| 発行済み (発行解除および再発行) | ✅ 表示可能 (参加者メタデータ更新済みイベントを介して即時) | ⚠️ 最終的に表示可能 (参加者が参加したイベントを介して再公開) | 