任意の JSON 値の送受信

シグナリングメッセージの一部には、ユーザーが任意の JSON 値を送受信するためのフィールドが含まれます。 本章では JSON 値の送受信について説明します。 なお、シグナリングメッセージの詳細は WebRTC SFU Sora ドキュメント - WebSocket 経由のシグナリング を参照してください。

シグナリングメッセージ

シグナリングメッセージは Signaling 列挙型と種別ごとのクラスで表されます。 メッセージの種別と対応する Signaling 列挙子の定義を次に示します。 詳細は API リファレンス を参照してください。

  • type: connect

    • Signaling.connect(SignalingConnect)

  • type: offer

    • Signaling.offer(SignalingOffer)

  • type: answer

    • Signaling.answer(SignalingAnswer)

  • type: update

    • Signaling.update(SignalingUpdate)

  • type: candidate

    • Signaling.candidate(SignalingCandidate)

  • type: notify(SignalingNotify)

    • Signaling.notify(SignalingNotify)

  • type: ping

    • Signaling.ping(SignalingPing)

  • type: pong

    • Signaling.pong(SignalingPong)

  • type: disconnect

    • Signaling.disconnect

  • type: push

    • Signaling.push(SignalingPush)

上記のうち、任意の JSON 値を含むことができるメッセージとプロパティを次に示します。

  • type: connect (送信のみ)

    • metadata

    • notifyMetadata

  • type: notify (受信のみ)

    • authnMetadata

    • authzMetadata

    • metadata

  • type: push (受信のみ)

    • data

任意のJSON 値を送信する

任意の JSON 値を含むことができる送信用のメッセージは type: connect のみです。 metadatanotifyMetadata のメタデータを指定できます。

メタデータは Configuration の次のプロパティで指定できます。 どちらも Encodable プロトコルに準拠した値を指定します。

  • metadata -> Configuration.signalingConnectMetadata

  • notifyMetadata -> Configuration.signalingConnectNotifyMetadata

これらのプロパティの値は JSON に変換されて送信されます。 基本的なデータ型 (Bool, Int, Float, String, Array, Dictionary) は Encodable に対応しているので、 これらの値の組み合わせであればエンコード処理を実装する必要はありません。

上記のプロパティの内容と生成される JSON を次に示します。

// {"type":"connect", "metadata":"contents", ...}
config.signalingConnectMetadata = "contents"

// {"type":"connect", "metadata":{"key":"value"}, ...}
config.signalingConnectMetadata = ["key": "value"]

送信されるメタデータの内容を確認するには、デバッグログを有効にしてシグナリングの内容をコンソールに出力してください。 詳細は SDK のログをコンソールに出力する を参照してください。

受信した任意の JSON 値を取得する

受信用のメッセージの type: notify と type: push の一部のプロパティは任意の JSON 値を含むことができます。 任意の JSON 値の型は Any? です。 受信した JSON 値は JSONSerialization クラスで解析されます。 解析後のオブジェクトは NSString, NSNumber, NSArray, NSDictionary, NSNull のいずれかです。

プロパティはシグナリング用のイベントハンドラで取得できます。 受信したメッセージ及び同メッセージを含む WebSocket メッセージを取得できるイベントハンドラを次に示します。 WebSocket メッセージはテキストなので、手動で JSON を解析する必要があります。

  • MediaChannelHandlers.onReceiveSignaling: 受信したメッセージを取得します。

  • WebSocketChannelHandlers.onReceive: 受信したメッセージを含む WebSocket メッセージを取得します。

イベントハンドラで JSON 値を取得する例を次に示します。

// MediaChannelHandlers でメッセージを取得する
mediaChannel.handlers.onReceiveSignaling = { signaling in
    switch signaling {

    // type: notify
    case .notify(let notify):
        switch notify.eventType {
        case "connection.created":
            // メタデータに含まれる JSON 値 (Any) を任意の型にキャストする
            if let metadata = notify.metadata as? [String: Any] {
                print("metadata => \(metadata)")
            }
            if let authnMetadata = notify.authnMetadata as? [String: Any] {
                print("authn => \(authnMetadata)")
            }
            if let authzMetadata = notify.authzMetadata as? [String: Any] {
                print("authz => \(authzMetadata)")
            }
            ...

        // 他のイベント種別でも同様に処理する
        case "connection.created":
            ...

        default:
            ...
        }

    // type: push
    case .push(let push):
        if let data = push.data as? [String: Any] {
            print("data => \(data)")
        }
        ...

    default:
        ...
    }
}

// WebSocket メッセージを手動で解析する場合
mediaChannel.webSocketChannel.handlers.onReceive = { message in
    switch message {
    case .text(let text):
        // 受信したシグナリングのテキストデータを JSON データとして解析する
        if let data = text.data(using: .utf8) {
            do {
                if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                    switch json["type"] as? String {
                    case "notify":
                        // type: notify
                        print("notify metadata => \(json["metadata"])")
                        ...
                    case "push":
                        // type: push
                        print("push data => \(json["data"])")
                        ...
                    default:
                        ...
                    }
                }
            } catch let error {
                // JSON の解析に失敗した場合のエラー処理
                // ここに来ることはないので無視してよい
            }
        }
        ...
    case .binary(_):
        // シグナリングでバイナリデータは来ないので何もしなくてよい
        ...
    }
}
© Copyright 2018-2024, Shiguredo Inc. Created using Sphinx 8.0.2