
# 2025.1.x から 2025.2.x への移行


## シグナリング の `"type": "connect"` メッセージの JSON に `multistream` 項目をデフォルトでは含めないように変更

2025.1.x までは必ず `multistream` を connect メッセージに含めていましたが、2025.2.x 以降はデフォルトでは `multistream` 項目を含めないようにしました。

### 経緯

Sora のバージョン 2025.1.0 からレガシーストリームが廃止され、connect メッセージの multistream 項目が廃止されました。

この変更に合わせて Sora iOS SDK でも connect メッセージの multistream 項目をデフォルトで送信しない仕様に変更しました。

これに伴い、デフォルトでは `multistream` を含めない挙動にするために `Configuration` の設定に応じて接続メッセージに `multistream: true` を自動的に設定する仕様も廃止しました。

connect メッセージに `multistream` を含める必要がある場合は引き続き `Configuration` を初期化する際に `multistreamEnabled` を指定してください。

### 移行方法

Sora 2025.1.0 以降リリースされた Sora を利用する場合は `multistreamEnabled` を指定しないようにしてください。

```swift
let config = Configuration(url: url,
                              channelId: channelId,
                              role: .sendrecv)
```


## シグナリング の `"type": "connect"` メッセージの `multistream` を自動で true に設定する仕様を廃止

2025.1.x までは `Configuration` の設定時に条件に応じて自動的に connect メッセージに `multistream: true` を設定していましたが、2025.2.x では本仕様を廃止しました。

廃止の経緯は [シグナリング の "type": "connect" メッセージの JSON に multistream 項目をデフォルトでは含めないように変更](2025_1_to_2025_2.html#2ad63c) の経緯に記載しています。

### 影響を受けるケース

自動的に `multistream: true` が設定される仕様に依存していた場合は影響を受ける可能性があります。

2025.2.x の移行で影響を受けるケース:

- Sora がデフォルトでレガシーストリームを使うように設定されている、かつ `Configuration` が以下のいずれかの設定になっている場合- `role` が `.sendrecv` である場合
  - `spotlightEnabled` が `.enabled` である場合

### 移行方法

connect メッセージに `multistream: true` を含める必要がある場合は `Configuration` の `multistreamEnabled` に `true` を指定してください。

```swift
let config = Configuration(url: url,
                              channelId: channelId,
                              role: .sendrecv,
                              multistreamEnabled: true)
```


## onDisconnect: ((Error?) -> Void)? から onDisconnect: ((SoraCloseEvent) -> Void)? への移行

Sora iOS SDK 2025.2.x から 引数に `SoraCloseEvent` を持った `onDisconnect` コールバックを `MediaChannelHandlers` に追加しました。

SoraCloseEvent には、Sora との接続が終了したときのステータスコードと切断理由、または Error が含まれています。

`onDisconnect: ((SoraCloseEvent) -> Void)?` に移行することにより、Sora から切断された理由をアプリケーションで取得することが可能になります。

> **警告**
>
> 2025.1.x までの `onDisconnect` は `onDisconnectLegacy` に名前が変更になり、非推奨となりました。
> 移行法を参照し、どちらかの手段で移行してください。

### 移行方法

以下の 2 つの移行方法があります。

#### 新 onDisconnect への移行

2025.2.x からは ((Error?) -> Void)? から ((SoraCloseEvent) -> Void)? に移行してください。

```swift
// 移行前
config.mediaChannelHandlers.onDisconnect = { [weak self] error in
    guard let self = self else { return }

    if let error {
        // エラー内容を表示
        print("エラー内容: \(error.localizedDescription)")
    } else {
        // 正常に切断された場合の処理
        print("正常に切断されました")
    }
}

// 移行後 (SoraCloseEvent のハンドリング処理を実装する)
config.mediaChannelHandlers.onDisconnect = { [weak self] event in
    guard let self = self else { return }
    switch event {
    case .ok(let code, let reason):
        // 正常に切断された場合の処理
        print("切断コード: \(code)")
        print("切断理由: \(reason)")
    case .error(let error):
        // エラー内容を表示
        print("エラー内容: \(error.localizedDescription)")
    }
}
```

SoraCloseEvent の定義は以下のようになっています。

```swift
enum SoraCloseEvent {
    // 正常系
    case ok(code: Int, reason: String)
    // 異常系
    case error(Error)
}
```

#### 旧 onDisconnect を使い続ける

onDisconnect を onDisconnectLegacy に置き換えることで、旧 onDisconnect を使い続けることができます。

```swift
// onDisconnect を onDisconnectLegacy に置き換える
config.mediaChannelHandlers.onDisconnectLegacy = { [weak self] error in
    guard let self = self else { return }

    if let error {
        // エラー内容を表示
        print("エラー内容: \(error.localizedDescription)")
    } else {
        // 正常に切断された場合の処理
        print("正常に切断されました")
    }
}
```
