Sora iOS SDK ドキュメント

このドキュメントは Sora iOS SDK バージョン 2025.1.1 に対応しています。

Sora 自体の製品お問い合わせは sora at shiguredo dot jp までお願い致します。 (このメールアドレスへの特定電子メールの送信を拒否いたします)

問い合わせについて

Sora iOS SDK の質問などについては Discord の #sora-sdk-faq をご利用ください。 ただし、 Sora のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。

https://discord.gg/shiguredo

Sora iOS SDK に対する有償のサポートについては提供しておりません。

重要なお知らせ

2023.3.0 にて利用不可項目の削除を行いました

2023.3.0 にて廃止、廃止予定項目の削除を行いました。対象の項目を利用していた場合、ビルドエラーが発生します。 移行作業が必要となるため 2023.3.0 で実施する利用不可項目の削除について を参照して対応をお願いします。

Sora iOS SDK 概要

Sora iOS SDK は 株式会社時雨堂 の「 WebRTC SFU Sora 」の iOS 専用クライアントフレームワークです。 WebRTC の複雑な接続処理を肩代わりする API を提供し、 Sora を利用する iOS アプリケーションを最小限のソースコードで実装できます。

主な仕様
Sora との接続

Sora と接続してメディアチャネルの通信を確立します。

メディアデータの再生

Sora との間に送受信されるメディアデータ (映像と音声) を描画・再生する UI コンポーネントを提供します。

カメラとマイクの自動的な初期化

メディアチャネルの通信が確立すると iOS 端末のカメラとマイクが初期化され、カメラとマイクからの入力を Sora に送信できるようになります。

非対応の機能

次の機能は非対応です。 現在対応する予定はありません。

  • Objective-C API: Sora iOS SDK は Swift にのみ対応します。

ソースコード
サンプルソースコード
問い合わせについて

Sora iOS SDK の質問などについては Discord の #sora-sdk-faq チャンネルにお願いします。 ただし、 Sora のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。

https://discord.gg/shiguredo

Sora iOS SDK に対する有償のサポートについては提供しておりません。

リリースノート

CHANGE

後方互換性のない変更

UPDATE

後方互換性がある変更

ADD

後方互換性がある追加

FIX

バグ修正

2025.1.1
日付:

2025-01-23

対応 Sora:

2024.2.0 以降

対応 iOS:

14.0 以降

対応 libwebrtc:

m132.6834.5.2

  • [FIX] WebRTC m132.6834.5.2 にアップデートしました

    • Apple 非公開 API を利用していたため、App Store Connect へのアップロードに失敗する問題に対応しました

2025.1.0
日付:

2025-01-21

対応 Sora:

2024.2.0 以降

対応 iOS:

14.0 以降

対応 libwebrtc:

m132.6834.5.1

  • [UPDATE] WebRTC m132.6834.5.1 にアップデートしました

  • [UPDATE] システム条件を変更しました

    • IPHONEOS_DEPLOYMENT_TARGET を 14.0 に変更

    • SwiftPM の platforms の設定を v14 に変更

    • CocoaPods の platform の設定を 14.0 に変更

  • [UPDATE] SignalingOffer に以下の項目を追加しました

    • version

    • simulcastMulticodec

    • spotlight

    • channelId

    • sessionId

    • audio

    • audioCodecType

    • audioBitRate

    • video

    • videoCodecType

    • videoBitRate

  • [UPDATE] SignalingNotify に以下の項目を追加しました

    • timestamp

    • spotlightNumber

    • failedConnectionId

    • currentState

    • previousState

  • [ADD] ForwardingFilter に name と priority を追加しました

  • [ADD] シグナリング connect 時にリスト形式の転送フィルターを設定するための項目を追加しました

    • ConfigurationSignalingConnectforwardingFilters を追加しました

2024.3.0
日付:

2024-09-06

対応 Sora:

2024.1.0 以降

対応 iOS:

13.0 以降

対応 libwebrtc:

m127.6533.1.1

  • [CHANGE] MediaChannelConfiguration を非推奨にしました

    • SDK 内部では利用していないため非推奨としています

    • 現在ご利用の方はこのクラス定義をご自分のプロジェクトにコピーしてご利用ください

  • [UPDATE] libwebrtc m127.6533.1.1 にアップデートしました

  • [UPDATE] SignalingOffersimulcast: Bool? を追加しました

  • [UPDATE] システム条件を変更しました

    • macOS 14.6.1 以降

    • Xcode 15.4

    • WebRTC SFU Sora 2024.1.0 以降

  • [FIX] SignalingConnect の metadata, signaling_notify_metadata が未設定 (nil) の場合に {} として送信されてしまう問題を修正しました

    • 未設定の場合は項目が含まれて送信されないように修正しました

    • この修正により、Configuration.signalingConnectMetadata の値が未指定の場合は Sora の認証ウェブフックに metadata, authn_metadata の項目が送信されなくなります

    • この修正により、Configuration.signalingConnectNotifyMetadata の値が未指定の場合は Sora のイベントウェブフックに metadata の項目が送信されなくなります

    • 修正前の動作を維持して {} を送信したい場合は、 Configuration.signalingConnectMetadata および Configuration.signalingConnectNotifyMetadata に中身が空の Encodable プロトコルに準拠したオブジェクトを指定してください

    • 例) configration.signalingConnectMetadata = [String: String]()

  • [FIX] 認証ウェブフック成功時に払い出された simulcast の値が反映されない不具合に対応しました

  • [FIX] スポットライト機能が有効の条件で WrapperVideoEncoderFactory のサイマルキャスト機能が有効になる不具合を修正しました

    • 利用上に不具合はありませんが、意図しないエンコーダーの設定になっていたため修正しました

  • [FIX] TURN URI に IPv6 アドレスが設定されている場合に接続ができない不具合を修正しました

    • TURN URI 文字列に対して、内部処理で意図しないエスケープ処理が行われていた問題を修正しました

2024.2.0
日付:

2024-04-23

対応 Sora:

2023.2.0 以降

対応 iOS:

13.0 以降

対応 libwebrtc:

m122.6261.1.0

  • [CHANGE] シグナリング connect メッセージの libwebrtc に含まれるバージョン文字列を変更しました

    • Android とフォーマットを統一しました

    • "Shiguredo-build M122 (M122.1.0 6b419a0)" から "Shiguredo-build M122 (122.6261.1.0 6b419a0)" に変更されます

  • [UPDATE] libwebrtc を m122.6261.1.0 に更新しました

    • libwebrtc の AV1 デコード機能の脆弱性対応が含まれています

  • [UPDATE] システム条件を変更しました

    • macOS 14.4.1 以降

    • Xcode 15.3

    • Swift 5.10

2024.1.0
日付:

2024-02-26

対応 Sora:

2023.2.0 以降

対応 iOS:

13.0 以降

対応 libwebrtc:

m121.6167.4.0

  • [CHANGE] Sora 2022.1.0 にて metadata_list が廃止されたのに伴い、 SignalingNotifymetadataList を削除しました

    • 代わりに SignalingNotifydata で値を取得できます

  • [CHANGE] VideoView のバックエンドを RTCEAGLVideoView から RTCMTLVideoView に変更しました

    • libwebrtc のアップデートに伴い RTCEAGLVideoViewdeprecated になったことに伴う修正です

  • [UPDATE] システム条件を変更しました

    • macOS 14.3.1 以降

    • WebRTC SFU Sora 2023.2.0 以降

    • CocoaPods 1.15.2 以降

    • Xcode 15.2

    • Swift 5.9.2

  • [UPDATE] CameraVideoCapturer のログを出力するようにしました

  • [UPDATE] libwebrtc のバージョンを 121.6167.4.0 に更新しました

    • HEVC (H.265) 対応パッチを含んだバージョンです

  • [UPDATE] 解像度に qHD (960x540) を追加しました

  • [UPDATE] CocoaPods を v1.15.2 に更新しました

  • [UPDATE] Sora 2023.2.0 で対応した ForwardingFilterversionmetadata を追加しました

  • [ADD] VideoCodec にハードウェアアクセラレーターを利用した HEVC(H.265) の映像を送受信できるようにするコーデック指定 H265 を追加しました

  • [ADD] リソースの逼迫により、送信する映像の品質が維持できない場合に、解像度やフレームレートのどちらを維持するかを指定できる設定 degradationPreferenceWebRTCConfiguration に追加しました

  • [FIX] ForwardingFilteraction を未指定にできるように修正しました

  • [FIX] SignalingNotify に項目を追加しました

    • sessionId

    • kind

    • destinationConnectionId

    • sourceConnectionId

    • recvConnectionId

    • sendConnectionId

    • streamId

2023.3.1
日付:

2023-10-24

対応 Sora:

2023.1.0

対応 iOS:

13.0 以降

対応 libwebrtc:

m116.5845.6.1

  • [FIX] AVCaptureDevice.Format の選択時にフレームレートを考慮するように修正しました

    • フレームレートに 60 を設定しても、 AVFrameRateRange が 1-30 の AVCaptureDevice.Format が選択されてしまうケースがあったため修正しました

    • 修正前は、カメラから同じ解像度の AVCaptureDevice.Format が複数取得された場合、最初に解像度が一致した AVCaptureDevice.Format を選択しており、フレームレートが考慮されていなかったことが原因です

2023.3.0
日付:

2023-09-13

対応 Sora:

2023.1.0

対応 iOS:

13.0 以降

対応 libwebrtc:

m116.5845.6.1

  • [CHANGE] @available(*, unavailable) アトリビュートの項目を削除しました

  • [CHANGE] @available(*, deprecated, ... ) としていた非推奨項目を削除する

  • [CHANGE] PeerChannel.swiftSignalingChannel.swiftonConnectHandleronConnect に置き換えました

    • 既に他のファイルでは名称変更を行なっていたがこのファイルのみ変更が行われていなかったため対応する

  • [UPDATE] WebRTC 116.5845.6.1 に対応しました

  • [FIX] MediaChannelconnectionCount, publisherCount, subscriberCount に値が設定されない不具合を修正しました

    • Sora のシグナリングメッセージ、 channel_upstream_connections, channel_downstream_connections が廃止された契機で値が設定されなくなっていました

    • Sora のシグナリングメッセージ、channel_sendrecv_connections, channel_sendonly_connections, channel_recvonly_connections, channel_connections を元に値を設定するよう修正

2023.2.0
日付:

2023-08-01

対応 Sora:

2023.1.0

対応 iOS:

13.0 以降

対応 libwebrtc:

m115.5790.7.0

  • [UPDATE] WebRTC 115.5790.7.0 に対応しました

  • [UPDATE] システム条件を変更しました

    • macOS 13.4.1 以降

    • WebRTC SFU Sora 2023.1.0 以降

    • Xcode 14.3.1

    • Swift 5.8.1

    • CocoaPods 1.12.1 以降

  • [ADD] サイマルキャストを VP9 / AV1 で利用できるようにしました

  • [ADD] 接続時に転送フィルターを指定できるようにしました

  • [ADD] 接続時に映像コーデックパラメーターを指定できるようにしました

2023.1.0
日付:

2023-04-07

対応 Sora:

2022.2.0

対応 iOS:

13.0 以降

対応 libwebrtc:

m112.5615.1.0

  • [UPDATE] WebRTC 112.5615.1.0 に対応しました

  • [UPDATE] システム条件を変更しました

    • macOS 13.3 以降

    • Xcode 14.3

    • Swift 5.8

    • WebRTC SFU Sora 2022.2.0 以降

  • [UPDATE] CameraSettingsResolutionuhd2160p, uhd3024p を追加しました

  • [ADD] ConfigurationaudioStreamingLanguageCode を追加しました

  • [FIX] m107.5304.4.1 利用時、シグナリング時に EXEC_BAD_ACCESS が発生する事象を修正しました

    • RTCPeerConnection.offer() に渡すブロック内で RTCPeerConnection.close() を呼んでいるのが原因だと思われるため、 async/await を使って offer() の終了を待ってから close() するよう修正しました

    • RTCPeerConnection.offer() の実行が非同期で行われるようになりましたが、 NativePeerChannelFactory.createClientOfferSDP() の用途では問題はありません

既知の問題

ネットワーク

現在、 Sora で IPv6 を有効にしていると Sora iOS SDK では接続できない事象が発生しています。Sora の設定により回避が可能です。Sora ドキュメント sora.conf の turn_fqdn を設定する をご確認ください。

映像のエンコーディングパラメータ

サイマルキャスト機能とスポットライト機能での映像のエンコーディングパラメータのうち、 Sora iOS SDK は adaptivePtime に現在対応していません。

クライアント側の証明書チェック

Sora iOS SDK は Sora とのシグナリングおよび TURN-TLS にて TLS を利用していますが、現在、SDK 側に証明書の検証を無効にする設定がないため、自己署名証明書をご利用いただくことができません。

FAQ

一般
Sora iOS SDK は有償ですか?

Sora iOS SDK はオープンソースライセンス Apache License 2.0 で配布しています。

Sora がなくても使えますか?

Sora iOS SDK は Sora 専用です。 Sora 以外の環境では動作しません。

Objective-C で使えますか?

使えません。 Sora iOS SDK は Swift 専用です。

ソースコードをダウンロードしたい

git clone などでソースコードをダウンロードする場合は、タグを指定するか master ブランチを選択してください。 develop ブランチは動作の保証ができませんので注意してください。

Bitcode に対応していますか?

対応しています。

サンプルコードはありますか?

サンプルコードは https://github.com/shiguredo/sora-ios-sdk-samples で提供しています。

設定
Sora iOS SDK が対応している音声コーデックを教えてください

Sora iOS SDK は以下の音声コーデックに対応しています。

  • Opus

Sora iOS SDK が対応している映像コーデックを教えてください

Sora iOS SDK は以下の映像コーデックに対応しています。

  • VP8

  • VP9

  • AV1

  • H.264

  • H.265

Sora iOS SDK はハードウェアアクセラレーターに対応していますか?

以下の映像コーデックで Video Toolbox を利用したハードウェアアクセラレーターに対応しています。

  • H.264

  • H.265

Sora の TURN 機能を無効にして利用できますか?

できません。

Sora iOS SDK は Sora を turn = false に設定して利用することはできません。

自己署名証明書は利用できますか?

できません。優先実装にて対応可能です。

AVAudioSession.Category は何を設定していますか?

Sora iOS SDK はマイクの利用有無に関わらず、 AVAudioSession.Category.playAndRecord に設定しています。

それ以外のカテゴリを使用したい場合は接続後に変更が可能です。 AVAudioSession のプロパティを変更する も参考にしてください。

Sora iOS SDK で受信した音声の音量が小さいです

Sora iOS SDK のデフォルトで使用している AVAudioSession.Category の .playAndRecord はマイク利用が必要となる設定ですが、この場合受信する音量が小さくなります。

これは iOS の仕様です。必要に応じて AVAudioSession.Category を変更してください。

サポート
有償サポートは受けられますか?

Sora iOS SDK の有償サポートは提供していません。

質問やバグ報告はどこで行えますか?

Sora iOS SDK についての質問やバグ報告は Discord の #sora-sdk-faq チャンネルにお願いします。

https://discord.gg/shiguredo

ただし、 Sora のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。

Issue の内容はどのように書けばいいですか?

使い方の質問やバグ報告であれば、次の開発環境のバージョンを「メジャーバージョン、マイナーバージョン、メンテナンスバージョン」まで含めて書いてください (Xcode 9.0 など) 。 これらの開発環境はメンテナンスバージョンの違いでも Sora iOS SDK の挙動が変わる可能性があります。

  • Sora

  • Sora iOS SDK

  • Mac OS X

  • Xcode

  • Swift

  • iOS

  • CocoaPods

リリース
リリースサイクルを教えてください

Sora のメジャーバージョンアップ後に、 Sora へ追従を目的としたバージョンアップを行います。

ただし、具体的なリリースサイクルはありません。

移行ドキュメント

2023.3.0 で実施する利用不可項目の削除について
概要

@available(*, unavailable) および、 @available(*, deprecated, ... ) の項目について削除を行います。 これらの項目について利用している場合は 2023.3.0 でビルドエラーが発生します。以下のドキュメントを参考に移行への対応をお願いします。

経緯

@available(*, unavailable) について、Swift 5.9 以降 @available(*, unavailable) attribute が廃止となるため削除をします。 このアトリビュートはプロパティが廃止済みであることを伝えるためのものです。

@available(*, deprecated, ... ) については非推奨 (廃止予定) の項目について移行を促すために記載していたものです。 1 年以上経過しているため削除をします。 移行先の項目は廃止項目をご確認ください。

廃止項目
@available(*, unavailable) が指定されている項目

すでに廃止されており、Sora iOS SDK 2023.2.0 時点の SDK で利用した場合はビルドエラーが発生する項目です。 移行が未完了の場合は、以下を参考に移行をお願いします。

  • Configrationurl

    • シグナリング URL の複数指定が可能となったため廃止となりました。

    • urlCandidates で代替してください。

  • ConfigrationsignalingChannelHandlers

    • 廃止となりました。利用できません。

    • mediaChannelHandlers で代替してください。

  • ConfigrationPeerChannelHandlers

    • 廃止となりました。利用できません。

    • mediaChannelHandlers で代替してください。

  • ConfigrationsignalingChannelType

    • 廃止となりました。利用できません。

  • ConfigrationwebSocketChannelType

    • 廃止となりました。利用できません。

  • ConfigrationpeerChannelType

    • 廃止となりました。利用できません。

  • ConfigrationallowsURLSessionWebSocketChannel

    • 廃止となりました。利用できません。

  • ConfigrationvideoCapturerDevice

    • 廃止となりました。利用できません。

    • カメラの設定については ConfigrationcameraSettings にて指定できます。

    • カスタムキャプチャーについては MediaStream.send(videoFrame:) を利用して映像フレームを送信してください。

    • カメラの操作 も参考にしてください。

  • MediaChannelHandlerswebSocketChannel

    • 廃止となりました。利用できません。

  • WebSocketChannelHandlersonMessageHandler

    • onReceive に置き換えられました。

  • WebSocketChannelHandlersonDisconnectHandler

    • 廃止となりました。利用できません。

  • WebSocketChannelHandlersonPongHandler

    • 廃止となりました。利用できません。

  • WebSocketChannelHandlersonSendHandler

    • 廃止となりました。利用できません。

  • WebSocketChannelHandlersonDisconnect

    • 廃止となりました。利用できません。

  • WebSocketChannelHandlersonPong

    • 廃止となりました。利用できません。

  • WebSocketChannelHandlersonSend

    • 廃止となりました。利用できません。

  • WebSocketChannel

    • 廃止となりました。利用できません。

  • VideoCapturerDevice

    • 廃止となりました。利用できません。

  • VideoCapturer

    • 廃止となりました。利用できません。

    • カスタムキャプチャーについては MediaStream.send(videoFrame:) を利用して映像フレームを送信してください。

  • VideoCapturerHandlers

    • 廃止となりました。利用できません。

    • カスタムキャプチャーについては MediaStream.send(videoFrame:) を利用して映像フレームを送信してください。

  • CameraVideoCapturershared

    • 廃止となりました。利用できません。

    • 起動中の CameraVideoCapturerCameraVideoCapturer.current! で取得できます。

  • CameraVideoCapturersettings

    • 廃止となりました。利用できません。

    • CameraSettings に定義を行うように変更しています。

  • CameraVideoCapturercaptureDevices

    • CameraVideoCapturerdevices を利用して取得をおこなってください。

  • CameraVideoCapturercaptureDevice(for position: AVCaptureDevice.Position)

    • CameraVideoCapturerdevice(for position: AVCaptureDevice.Position) を利用して取得をおこなってください。

  • CameraVideoCapturersuitableFormat(for device: AVCaptureDevice, resolution: Any)

    • 廃止となりました。利用できません。

    • CameraVideoCapturerformat(width: Int32, height: Int32, for device: AVCaptureDevica, frameRate: Int?) で代替してください。

  • CameraVideoCapturersuitableFrameRate(for format: AVCaptureDevice.Format, frameRate: Int)

    • 廃止となりました。利用できません。

    • CameraVideoCapturermaxFrameRate(_ frameRate: Int, for format: AVCaptureDevice.Format) で代替してください。

  • CameraVideoCapturercanStop

    • 廃止となりました。利用できません。

    • Sora との切断時にカメラは自動的に停止されます。

  • CameraVideoCapturerstopWhenDone

    • 廃止となりました。利用できません。

    • Sora との切断時にカメラは自動的に停止されます。

  • CameraVideoCapturerstopWhenDone

    • 廃止となりました。利用できません。

    • Sora との切断時にカメラは自動的に停止されます。

  • SignalingMetadata

    • 廃止となりました。利用できません。

    • メタデータは Any? を任意の型にキャストして利用してください。

  • SignalingClientMetadata

    • 廃止となりました。利用できません。

    • SignalingNotifyMetadata で代替してください。

  • SignalingNotifyEventType

    • 廃止となりました。利用できません。

  • SignalingNotifyConnection

    • 廃止となりました。利用できません。

    • この Struct の定義は SignalingNotify に集約されています。

  • SignalingNotifySpotlightChanged

    • 廃止となりました。利用できません。

    • この Struct の定義は SignalingNotify に集約されています。

  • SignalingNotifyNetworkStatus

    • 廃止となりました。利用できません。

    • この Struct の定義は SignalingNotify に集約されています。

  • DeviceInfomodel

    • 廃止となりました。利用できません。

@available(*, deprecated, ... ) が指定されている項目

Sora iOS SDK 2023.2.0 までは警告のみで内部的に移行先に値を設定しておりビルドエラーは発生しませんでした。項目自体を削除したため、以下を参考に移行をお願いします。 移行が未完了の場合は、以下を参考に移行をお願いします。

  • Rolepublisher

    • 廃止となりました。利用できません。

    • sendonly で代替してください。

  • Rolesubscriber

    • 廃止となりました。利用できません。

    • recvonly で代替してください。

  • Rolegroup

    • 廃止となりました。利用できません。

    • sendrecv で代替してください。

  • RolegroupSub

    • 廃止となりました。利用できません。

    • recvonly で代替してください。

  • Configrationinit

    • 初期化時にマルチストリームの指定が必須となりました。

    • Configuration(url: url, channelId: soraChannelId, role: .recvonly, multistreamEnabled: false) のように指定してください。

  • Configrationspotlight

    • spotlightNumber に置き換えられました。

  • ConfigrationactiveSpeakerLimit

    • spotlightNumber に置き換えられました。

  • SignalingConnectspotlight

    • spotlightNumber に置き換えられました。

  • SignalingConnectactiveSpeakerLimit

    • spotlightNumber に置き換えられました。

  • SignalingNotifypublisherCount

    • 廃止となりました。利用できません。

    • channelSendonlyConnectionschannelSendrecvConnections の合計値で代替してください。

  • SignalingNotifysubscriberCount

    • 廃止となりました。利用できません。

    • channelRecvonlyConnectionschannelSendrecvConnections の合計値で代替してください。

  • SoraHandlersonConnectHandler

    • onConnect に置き換えられました。

  • SoraHandlersonDisconnectHandler

    • onDisconnect に置き換えられました。

  • SoraHandlersonAddMediaChannelHandler

    • onAddMediaChannel に置き換えられました。

  • SoraHandlersonRemoveMediaChannelHandler

    • onRemoveMediaChannel に置き換えられました。

  • MediaChannelHandlersonConnectHandler

    • onConnect に置き換えられました。

  • MediaChannelHandlersonDisconnectHandler

    • onDisconnect に置き換えられました。

  • MediaChannelHandlersonAddStream

    • onRemoveStreamHandler に置き換えられました。

  • MediaChannelHandlersonDisconnectHandler

    • onRemoveStream に置き換えられました。

  • MediaChannelHandlersonReceiveSignalingHandler

    • onReceiveSignaling に置き換えられました。

  • MediaStreamHandlersonSwitchVideoHandler

    • onSwitchVideo に置き換えられました。

  • MediaStreamHandlersonSwitchAudioHandler

    • onSwitchAudio に置き換えられました。

  • CameraPosition

    • 起動時のカメラ設定は Configuration.cameraSettings.position.front または .back を設定します。

    • 起動後のカメラの切り替えは CameraVideoCapturerflip(_:completionHandler:) を使用します。

    • カメラの操作 も参考にしてください。

  • CameraVideoCapturercurrentCameraDevice

    • CameraVideoCapturerdevice を利用して取得をおこなってください。

セットアップ

システム条件

Sora iOS SDK を利用するアプリケーションの開発に必要なシステム条件を次に示します。

  • iOS 14 以降

  • アーキテクチャ arm64 (シミュレーターの動作は未保証です)

  • Xcode 16.2

  • Swift 5.10

  • CocoaPods 1.15.2 以降 (Swift Package Manager を利用する場合は不要です)

  • WebRTC SFU Sora 2024.2.0 以降

Xcode プロジェクトのセットアップ
概要

Sora iOS SDK は CocoaPods または Swift Package Manager を利用してアプリケーションに追加できます。

CocoaPods を利用する
Spec リポジトリを登録する (初回のみ)

Sora iOS SDK は専用の Spec リポジトリで配布しています。 CocoaPods を利用する際は、次の手順で Spec リポジトリをローカルの環境に登録してください。

  1. Spec リポジトリをローカルの Spec リポジトリに登録します。

    $ pod repo add sora-ios-sdk-specs https://github.com/shiguredo/sora-ios-sdk-specs.git
    
  2. Spec のリストを更新します。

    $ pod repo update
    

以上の操作が必要になるのは初回のみです。 プロジェクト生成のたびに実行する必要はありません。

Podfile を用意する
  1. 先頭に次の記述を追加します。 Sora iOS SDK の Spec リポジトリから検索するようにします。

    source 'https://cdn.cocoapods.org/'
    source 'https://github.com/shiguredo/sora-ios-sdk-specs.git'
    
  2. Sora iOS SDK を利用するターゲットに pod 'Sora', VERSION の形式で Sora ライブラリを追加します。以下に例を示します。

    source 'https://github.com/shiguredo/sora-ios-sdk-specs.git'
    source 'https://github.com/CocoaPods/Specs.git'
    
    platform :ios, '10.0'
    
    target 'SoraQuickStart' do
      use_frameworks!
      pod 'Sora', '2020.7'
    end
    
  3. pod install を実行してライブラリをインストールします。

Swift Package Manager を利用する
パッケージを追加する
  1. Xcodeのメニューから[File]-[Add Packages...] を選択します

  2. 検索ボックスに https://github.com/shiguredo/sora-ios-sdk を入力します

_images/spm_package_repository.png
  1. 利用するSDK のバージョンを選択して [Add Package]を選択します

_images/spm_package_version.png
  1. Sora, WebRTC の両方を選択して [Add Package]を選択します

_images/spm_select_package.png
カメラとマイクを許可する

ナビゲーターエリアからプロジェクトエディターの Info タブを開き Custom iOS Target Properties にカメラとマイクの用途を記述します。 この記述を追加しないとアプリケーションが強制終了するので、必ず記述してください。

※ Xcode13 以前からのプロジェクトを利用する場合は、Info.plist ファイルに以下の記述を追加してください。

  • カメラの用途: "Privacy - Camera Usage Description"

  • マイクの用途: "Privacy - Microphone Usage Description"

設定例:

_images/privacy_settings.png

クイックスタート

この章では、 Sora iOS SDK を使ってシンプルな iOS アプリケーションを実行するまでの流れを紹介します。 この iOS アプリケーションを通じて、次の Sora iOS SDK の使い方を学べます。

  • メディアデータ (映像と音声) の送信と受信

  • 送受信する映像の描画

  • 端末のデバイス (カメラとマイク) の使用

ソースコードは sora-ios-sdk-quickstart リポジトリで配布しています。

用意するもの

バージョンなどの詳細な条件は システム条件 を参照してください。

  • iOS 端末 (Sora iOS SDK はシミュレーターに対応していません)

  • Mac OS X と Xcode

  • CocoaPods (Swift Package Manager を利用する場合は不要)

  • Sora

Sora については、ここでは次の条件での運用を仮定します。 これは Sora のチュートリアル が完了した時と同様の条件です。 詳しくは Sora のドキュメントを参照してください。

  • Sora のホスト名: "sora.example.com"

  • デモ機能: 有効

  • HTTPS を使用

  • WebSocket の接続に wss を使用

  • メディアチャネル ID: "sora"

サンプルアプリケーションをビルドする

コードを書く前に、サンプルアプリケーション SoraQuickStart をビルドして実行してみましょう。

ソースコードをダウンロードする

サンプルアプリケーションのソースコードは sora-ios-sdk-quickstart リポジトリで配布しています。 master ブランチをクローンもしくはダウンロードしてください。デフォルトのブランチは develop となっていますのでご注意ください。

ライブラリを追加する

ビルドに必要なライブラリを追加します。CocoaPods または Swift Package Manager を利用してアプリケーションに追加できます。

CocoaPods を利用する

セットアップの CocoaPods を利用する を参照して、追加を行います。 Sora iOS SDK の Spec リポジトリをローカルの環境に登録してください。 Podfile はソースコードに含まれています。pod install コマンドを実行してダウンロードします。 ダウンロード後に SoraQuickStart.xcworkspace が生成されるので、以降はこのファイルを開いてプロジェクトの開発を行います。

Swift Package Manager を利用する

セットアップの Swift Package Manager を利用する を参照して、追加を行います。

接続情報を設定する

接続する Sora のシグナリング URL とチャネル ID は Environment.swift に設定します。 SoraQuickStart ディレクトリ配下の Environment.example.swift を元に Environment.swift を作成してください。

$ cp SoraQuickStart/Environment.example.swift SoraQuickStart/Environment.swift

SoraQuickStart の Xcode プロジェクトを開き、接続する Sora のシグナリング URL とチャネル ID を設定します。

Environment.swift:

// 接続する Sora のシグナリング URL
static let url = URL(string: "wss://sora.example.com/signaling")!

// チャネル ID
static let channelId = "sora"
ビルドして実行する

iOS 端末をマシンに接続します (Sora iOS SDK はシミュレーターに対応していません。実機を利用してください) 。ビルドターゲットのアーキテクチャに接続した iOS 端末を選択してビルド・実行します (メニュー "Product" > "Run") 。

ビルド対象アーキテクチャの選択:

_images/build_arch.png
Sora に接続する

アプリケーションが起動したら、 Connect ボタンをタップすると Sora に接続します。 接続に成功するとカメラとマイクの使用許可を求めるダイアログが表示されます。 許可後、上下のビューにカメラの映像が表示されれば接続成功です。

接続できなかった場合は Sora の URL やネットワークの状態を確認してください。 Sora に接続できない も参照してください。

実装上の注意点
再接続について

Sora と Sora iOS SDK は再接続をサポートしていません。 意図しない接続解除が発生した場合、 Sora iOS SDK が自動的に再接続を行うことはありません。 再度同一のチャネルに接続する必要があれば、新たに接続処理を行うように実装してください。

カメラのマイクの初期化

カメラとマイクはパブリッシャーの接続時に初期化されます。 Sora iOS SDK では、カメラの映像は CameraVideoCapturer が扱います。 (Info.plist にプライバシーの設定を記述しないとアプリケーションが落ちますので注意してください )。

映像データの送信の仕組み

CameraVideoCapturer が取得したカメラの映像は、配信ストリームを通じて Sora に送信されます。

サンプルアプリケーションのポイント

サンプルアプリケーションにて実装されている Sora iOS SDK 開発のポイントを以下に記載します。

  • Sora の接続には「 Sora のシグナリング URL 」と「チャネル ID 」が必要です。接続に関する設定を Configuration にセットします。

  • Sora の接続は Sora オブジェクトの connect(configuration:webRTCConfiguration:handler:) を呼びます。

  • 映像の描画は VideoView オブジェクトが行います。 VideoView はストリームの videoRenderer プロパティにセットします。

  • 端末のカメラとマイクはパブリッシャーの接続時に初期化されて使用可能になります。

その他のサンプルコード

下記のリポジトリでその他の様々なサンプルコードを公開しています。

https://github.com/shiguredo/sora-ios-sdk-samples

Sora によるピア接続の流れ

Sora におけるピア接続の流れ

この節では Sora を使うピア接続の流れを説明します。 Sora iOS SDK を使えば詳細を知らなくてもアプリケーションを作れますが、 Sora とクライアントの挙動を理解しておくとトラブルに対処しやすいでしょう。

Sora は WebSocket でシグナリングの通信を行い、シグナリングメッセージを JSON フォーマットで送受信します。 WebSocket の接続が切れるとシグナリングを継続できなくなります。

クライアントは WebSocket で Sora に接続し、以下に示す connect メッセージを送信します (シグナリングメッセージの詳細は Sora のドキュメント を参照してください) 。

connect メッセージ例:

{
    "type": "connect",
    "role": "upstream",
    "channel_id": "Spam",
    "metadata": "1234abcd"
}

Sora は connect メッセージを受信すると認証を行います。 認証が成功すればクライアント ID (1 接続についてユニークな値) を発行し、クライアント ID を含む offer メッセージを返します。

offer メッセージ例:

{
    "type": "offer",
    "sdp": "<Offer 用 SDP>",
    "client_id": "<ユニークな ID>"
}

offer メッセージには Offer SDP が含まれます。 クライアントはこの段階でピア接続オブジェクト (WebRTC ライブラリの RTCPeerConnection オブジェクト) を生成し、 Offer SDP を remote description にセットします。 また offer メッセージは ICE に関する設定を含む場合があり、その設定はピア接続オブジェクトに反映されます。

このときにピア接続オブジェクトによって ICE candidate が生成されたら、クライアントは candidate メッセージを生成して ICE candidate の内容を Sora に送信します。

Offer SDP が無事に remote description にセットされたら、クライアントは Answer SDP を生成します。 Answer SDP はピア接続オブジェクトの local description にセットされ、それが成功すれば Answer SDP を含む answer メッセージを Sora に送信します。

answer メッセージ例:

{
    "type": "answer",
    "sdp": "<Answer 用 SDP>"
}

ICE 接続が成功すればピア接続完了です。 ピア接続中は接続状態などの情報がシグナリングで通信されます。 ICE 接続もしくはシグナリング接続が解除されるとピア接続は終了します。

Sora に接続する

概要

Sora への接続処理の概要について記載しています。

接続の手順

Sora への接続は次の手順で行います。

  1. Configuration を生成する。

  2. Sora オブジェクトの connect メソッド を呼ぶ。

    import Sora

    // シグナリング URL とチャネル ID を指定する
    let url = URL(string: "wss://sora.example.com/signaling")!
    let soraChannelId = "sora"
    let config = Configuration(url: url,
                                  channelId: soraChannelId,
                                  role: .recvonly,
                                  multistreamEnabled: false)

    // 接続する
    Sora.shared.connect(configuration: config) { mediaChannel, error in
        // 接続に失敗するとエラーが渡される。
        // 接続に成功すると error は nil
        if let error = error {
            // 接続エラー時の処理
            ...
        }

        // 接続成功時の処理
        // 映像を描画するビューをストリームにセットする等
        ...
    }
}

Configuration は Sora への接続情報などの設定を保持するオブジェクトです。 Sora のシグナリング URL 、チャネル ID 、ロール、マルチストリームの可否をセットします。

次に Configuration を引数として Sora オブジェクトの connect メソッド を呼びます。このとき Sora オブジェクトは Sora.shared プロパティでシングルトンを取得できます。 このメソッドは Sora への接続を行い、接続の成否に関わらず handler: に指定されたブロックを実行します。 接続が成功すると MediaChannel がブロックの引数として渡されます。 MediaChannel は接続後の操作を行うためのオブジェクトです。

connect メソッド の型と引数は次の通りです。

func connect(configuration: Configuration,
             webRTCConfiguration: WebRTCConfiguration = WebRTCConfiguration(),
             handler: (_ mediaChannel: MediaChannel?, _ error: Error?) -> Void)
  • configuration: 接続情報です。シグナリング URL とチャネル ID を指定します。

  • webRTCConfiguration: WebRTC に関する設定です (省略可) 。

  • handler: 接続試行後に実行するブロックです。ブロックの型は (MediaChannel?, Error?) -> Void です。ブロックの引数は次の通りです。

    • mediaChannel: 接続に成功するとメディアチャネルが渡されます。失敗時は nil です。

    • error: 接続に失敗するとエラーが渡されます。成功時は nil です。

MediaChannel は映像データを扱うストリームを複数保持します。 映像はストリームを通じて Sora と送受信されます。

ストリームは送信か受信のいずれかを担当し、ロールによって扱う数が異なります。 シングルストリームにおいて、送信と受信のストリームはそれぞれ 1 つです。 つまり、シングルストリームでは 1 回の接続につき送信か受信かのいずれか一方しか行えません。 1 台の端末で映像の送受信を行う場合は、送信と受信で 2 回の接続が必要です。

接続後の映像の送受信については 映像を描画する を参考にしてください

DataChannel 経由のシグナリング

Sora と DataChannel を経由したシグナリング通信を行うための接続方法について記載します。 詳しい仕様は Sora のドキュメント を参照してください。

DataChannel 経由のシグナリングを有効にするには、 ConfigurationdataChannelSignaling プロパティに true をセットしてください。 WebSocket が閉じたときに Sora に接続が切断されたと判断して欲しくない場合は ignoreDisconnectWebSocket プロパティに true をセットしてください。

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// DataChannel 経由のシグナリングを有効にする
config.dataChannelSignaling = true

// WebSocket が閉じたことを無視する
config.ignoreDisconnectWebSocket = true
イベントハンドラ

DataChannel に関するイベントハンドラは MediaChannelHandlers に用意しています。 主なイベントハンドラは以下の通りです。

/// シグナリングが DataChannel 経由に切り替わったタイミングで呼ばれるクロージャー
public var onDataChannel: ((MediaChannel) -> Void)?

/// DataChannel のメッセージ受信時に呼ばれるクロージャー
public var onDataChannelMessage: ((MediaChannel, String, Data) -> Void)?
音声コーデックの設定

Sora 接続時に送信する音声についてコーデックの指定ができます。

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// 音声コーデックを opus に設定する
config.audioCodec = .opus
音声ビットレートの設定

Sora 接続時に送信する音声についてビットレートの指定ができます。

  • 音声のビットレートは ConfigurationaudioBitRate に設定します。

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// 音声ビットレートを 32 kbps に設定する
config.audioBitRate = 32
映像コーデックの設定

Sora 接続時に送信する映像についてコーデックの指定ができます。

  • 映像のコーデックは ConfigurationvideoCodecVideoCodec を設定します。

  • 利用できる映像コーデックは VP8 / VP9 / H.264 / H.265 / AV1 です。未指定の場合は Sora のデフォルト値が設定されます。

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// 映像コーデックを VP8 に設定する
config.videoCodec = .vp8
映像ビットレートの設定

Sora 接続時に送信する映像についてビットレートの指定ができます。

  • 映像のビットレートは ConfigurationvideoBitRate に設定します。

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// ビデオビットレートを 3000 kbps に設定する
config.videoBitRate = 3000
映像コーデックパラメーターの設定

送信する映像コーデックの設定と合わせて、映像コーデックのパラメータを指定可能です。 この機能は rolesendrecv または sendonly の場合に利用できます。

指定できる値の内容については以下の Sora ドキュメントを参照してください。

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// 映像コーデックの設定は VP9 / AV1 / H.264 のいずれか 1 種類のみです
// 利用しない映像コーデックパラメーターは設定しないでください

// VP9 の場合は profile_id の設定が可能です
config.videoCodec = .vp9
config.videoVp9Params = ["profile_id": 0]

// AV1 の場合は profile の設定が可能です
// config.videoCodec = .av1
// config.videoVp9Params = ["profile": 0]

// H.264 の場合は profile_level_id の設定が可能です
// config.videoCodec = .h264
// config.videoH264Params = ["profile_level_id": "42e01f"]
転送フィルターの設定

転送フィルター機能は、Sora 側でクライアントへ転送する音声や映像のパケットをフィルターする機能です。 詳しくは Sora ドキュメント を参照してください。

この機能は rolesendrecv または recvonly の場合にのみ利用できます。

フィルターを設定する

Sora 接続時に Configuration.forwardingFilters を設定します。

設定例

以下の例は、自分の接続に対して、以下の条件で映像または音声の受信をブロックします。

  • connection_id が "S8YEN0TSE13JDC2991NG4XZ150" の場合は音声と映像の受信をブロックする、または client_id が "screen-share" の場合は音声の受信をブロックする

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

let forwardingFilter = ForwardingFilter(
    action: .block,
    rules: [
        [
            ForwardingFilterRule(field: .connectionId,
                                 operator: .isIn,
                                 values: ["S8YEN0TSE13JDC2991NG4XZ150"]),
        ],
        [
            ForwardingFilterRule(field: .clientId,
                                 operator: .isIn,
                                 values: ["screen-share"]),
            ForwardingFilterRule(field: .kind,
                                 operator: .isIn,
                                 values: ["audio"]),
        ]
    ],
)

config.forwardingFilters = [forwardingFilter]
プロキシ・サーバーの設定

プロキシ・サーバーを 経由した通信を行う場合は、 Configurationproxy プロパティにプロキシ情報をセットしてください。

  • HTTP プロキシに対応しています

  • SOCKS プロキシも設定できますが、動作を確認していません

  • HTTP の CONNECT メソッドは HTTPS ではなく HTTP で送信します

  • Proxy-Authorization ヘッダーを利用した Basic 認証に対応しています

  • iOS の Wi-Fi に設定されたプロキシの項目を参照しません

var config = Configuration(url: url,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)

// proxy 情報の設定を行う
config.proxy = Proxy(host: "proxy.example.com",
                            port: 3128,
                            agent: nil,
                            username: "ham",
                            password: "egg")
複数のシグナリング URL を指定する

Sora iOS SDK では、 urlCandidates に複数のシグナリング URL を指定することができます。

Sora iOS SDK は全ての URL に対して接続を試行し、最初に成功した接続をシグナリングに使用します。 このため、1台でも正常なサーバーが残っていれば Sora への接続が成功します。 クラスター機能は複数の URL を指定しなくても利用できますが、冗長性を高めるために複数 URL の指定を推奨します。

let urlCandidates = [
    URL(string: "wss://sora1.example.com/signaling")!,
    URL(string: "wss://sora2.example.com/signaling")!,
    URL(string: "wss://sora3.example.com/signaling")!
]
var config = Configuration(urlCandidates: urlCandidates,
                           channelId: channelId,
                           role: .sendrecv,
                           multistreamEnabled: true)
  • 実際にシグナリングに利用されている URL は MediaChannel クラスの connectedUrl フィールドから確認できます。

クラスター機能利用時のシグナリングのリダイレクト

クラスター機能を有効にすると、 Sora から、 type: offer の代わりに type: redirect が送られてくることがあります。 この場合、Sora iOS SDK は Sora の接続を一度切断し、 type: redirect で指定された location に再接続します。

CPU やネットワーク帯域等逼迫時における映像品質優先項目の設定

映像の配信中に、CPU やネットワーク帯域などの制約を受けて、指定された解像度やフレームレートを維持できないことがあります。 そのような場合に、優先する項目を設定することができます。

例えば、文章が中心のスライドを利用するプレゼンテーションなど、フレームレートより解像度を優先した映像の配信を行いたい場合に、解像度を優先するように設定できます。

設定は ConfigurationwebRTCConfiguration.degradationPreference から行います。 degradationPreference には以下の値を設定できます。

  • disabled ... 何もしない

  • balanced ... バランスを取る

  • maintainResolution ... 解像度の維持を優先する

  • maintainFramerate ... フレームレートを維持を優先する (デフォルトの挙動です)

let config = Configuration(url: url,
                                channelId: soraChannelId,
                                role: .sendonly,
                                multistreamEnabled: true)

// リソースが逼迫した場合は解像度の維持を優先する
config.webRTCConfiguration.degradationPreference = .maintainResolution

マルチストリーム機能

概要

マルチストリーム機能とは、1 つのピア接続で複数のストリームを管理する機能です。 詳しくは Sora ドキュメント を参照してください。

マルチストリーム機能を有効にする

Sora にマルチストリーム機能で接続するには、 Configuration オブジェクトの生成時に multistreamEnabled 引数に true を指定します。 1 つの接続で送信と受信の両方を行うのであれば、ロールに .sendrecv を指定します。

接続例:

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

// ストリームが追加されたときに行う処理です。
config.mediaChannelHandlers.onAddStream = { [weak self] stream in
    ...
}

// ストリームが削除されたときに行う処理です。
config.mediaChannelHandlers.onRemoveStream = { [weak self] error in
    ...
}

Sora.shared.connect(configuration: config) {
    ...
}

マルチストリーム機能で接続すると、同一のチャネル ID に接続されているすべてのストリームが MediaChannel に追加されます。 同一のチャネル ID のストリームが増減すると MediaChannel が保持するストリームも増減します。 ストリームが追加されると MediaChannel のイベントハンドラ MediaChannelHandlers.onAddStreamHandler が、削除されると onRemoveStreamHandler が呼ばれます。

映像を描画するには、各ストリームにそれぞれ VideoRenderer をセットします。 イベントハンドラを利用して映像ビューを用意するとよいでしょう。

サイマルキャスト機能

概要

サイマルキャスト (Simulcast) 機能は配信時に 1 つの RTCPeerConnection から複数種類のエンコードした映像を配信する機能です。 詳細は Sora ドキュメント サイマルキャスト機能 を参照してください。

サイマルキャストを有効にする

Sora 接続時に Configuration.simulcastEnabled プロパティを true に設定します。 視聴時に受信する映像を Configuration.SimulcastRid で指定可能です。

サイマルキャストの Configuration 設定例

ビットレートや解像度が低い場合、 3 段階の画質の切替ができないことがあります。 詳細は Sora ドキュメント 現時点でのサイマルキャストの仕様 を参照してください。

// 接続の設定を行います。
let config = Configuration(url: soraURL,
                           channelId: soraChannelId,
                           role: role,
                           multistreamEnabled: multiplicityControl.selectedSegmentIndex == 1)

// サイマルキャストの有効化
config.simulcastEnabled = true

// サイマルキャスト受信時の映像を指定
config.simulcastRid = .r0

// 動画のコーデックを指定します
config.videoCodec = .vp8

// 十分な解像度、ビットレートを指定しないとサイマルキャストの映像が 3 本になりません
config.videoBitRate = 15000

// 解像度、フレームレートの設定
config.cameraSettings = CameraSettings(resolution: .hd1080p, frameRate: 30)

危険

2022 年 6 月のリリースよりスポットライト機能で複数画質を送信するにはサイマルキャスト機能を有効化する必要があります

スポットライト機能

概要

スポットライト機能は、一定の音量を超えて音声を発している参加者の画質を優先して配信する機能です。 詳細は以下ドキュメントを参照してください。

スポットライト機能を有効にする

Sora 接続時に以下を設定します

  • マルチストリーム機能を有効にします。

  • Configuration.spotlightEnabled プロパティに .enabled を指定します。

  • Configuration.simulcastEnabled プロパティを指定します。

    • 自分の映像について、音声に応じて画質の切り替えを行う場合は true を指定します。

    • 自分の映像について、音声に応じて画質の切り替えを行なわない場合は false を指定します。

追加で以下のオプションが設定可能です

  • Configuration.spotlightNumber プロパティでスポットライトのフォーカス数を指定します。

  • Configuration.spotlightFocusRid プロパティでフォーカスされている映像の rid を指定します。

  • Configuration.spotlightUnfocusRid プロパティでフォーカスされていない映像の rid を指定します。

スポットライトの Configuration 設定例
// 接続の設定を行います。マルチストリーム機能を有効にする必要があります。
let config = Configuration(url: soraURL,
                           channelId: soraChannelId,
                           role: role,
                           multistreamEnabled: true)

// サイマルキャストを有効にします。
// 自分が話していない時は画質が落ちた状態で配信されます。
config.simulcastEnabled = true

// スポットライトを有効にします。
config.spotlightEnabled = .enabled

// スポットライトのフォーカスする配信数を設定可能です。
config.spotlightNumber = 2

// スポットライトがフォーカスされている映像、フォーカスされていない映像の rid を設定可能です。
// 映像を受信しない設定も可能です。
config.spotlightFocusRid = .r1
config.spotlighspotlightUnfocusRidtEnabled = .none

// 動画のコーデックを設定します。
config.videoCodec = .vp8

任意の 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(_):
        // シグナリングでバイナリデータは来ないので何もしなくてよい
        ...
    }
}

カメラの操作

CameraVideoCapturer と AVCaptureDevice

Sora iOS SDK では、カメラの操作は CameraVideoCapturer を通して行います (以下、「キャプチャー」と表します) 。 キャプチャーはカメラを表す AVCaptureDevice と 1 対 1 で対応し、端末が搭載するカメラの数だけキャプチャーが存在 (あるいは生成) します。 デフォルトの設定では、前面カメラと背面カメラそれぞれの AVCaptureDevice に対応する 2 つのキャプチャーを用意しています。 前面カメラのキャプチャーは front 静的プロパティで、背面カメラのキャプチャーは back 静的プロパティで取得できます。

利用可能な AVCaptureDevice のリストは CameraVideoCapturer.devices 静的プロパティで取得できます。

AVCaptureSession

キャプチャーの映像は AVCaptureSession によって管理されます。 AVCaptureSessioncaptureSession プロパティで取得できます。

映像の流れ

キャプチャーが取得した映像は、映像フレームに変換されて stream プロパティのストリームに渡されます。 stream プロパティに nil をセットすれば、キャプチャーの映像はいずれのストリームにも流れません (カメラは停止されません) 。

デフォルトの設定では、Sora に接続すると自動的にカメラが起動され、配信ストリームがキャプチャーにセットされます。

解像度と最大フレームレート

カメラ (AVCaptureDevice) は複数の解像度と最大フレームレートの組み合わせに対応しています。 この情報は AVCaptureDevice.Format に含まれます (以下、「フォーマット」と表します) 。 フォーマットの内容は AVCaptureDevice ごとに異なります。 いずれの端末も前面カメラと背面カメラで解像度と最大フレームレートが異なります。

カメラの起動にはフォーマットとフレームレートを指定する必要があります。 AVCaptureDevice が対応するフォーマットを取得するには format(width:height:for:frameRate:) 静的メソッドを使います。 最も近い解像度でかつ指定したフレームレートに対応するフォーマットを取得できます。 必ずしも希望する解像度が使えるとは限りません。また、フォーマットが対応していないフレームレートを指定した場合は無視されます。適切な値を設定するよう注意してください。

カメラの起動時に指定するフレームレートは、フォーマットが対応する最大フレームレート以下である必要があります。 たとえば、最大フレームレートが 30fps であるフォーマットを使う場合、起動時に指定するフレームレートは 30fps 以下でなければなりません。 フォーマットで使用できる最大フレームレートは maxFrameRate(_:for:) 静的メソッドで取得できます。 このメソッドは、指定したフォーマットが対応するフレームレートの幅のうち、指定したフレームレートに最も近いフレームレートを返します。 たとえば 40fps を指定した場合、指定したフォーマットが 40fps 以上に対応していれば 40fps を返します。 40fps に対応していなければ、対応する最大フレームレート (30fps など) を返します。

カメラの操作が行われるディスパッチキュー

カメラの操作は専用のディスパッチキューで行われます。

カメラの起動と停止
カメラを起動する

デフォルトの設定では、カメラは配信開始時に自動的に起動します。 このときのカメラの設定は Configuration に指定する CameraSettings によります。 CameraSettings では次の項目を指定できます:

  • 解像度 (resolution プロパティ)

  • フレームレート (frameRate プロパティ)

  • 配信開始時のカメラの位置 (position プロパティ)

  • カメラの起動の有無 (isEnabled プロパティ)

配信開始時にカメラを停止しておき、あとから任意のタイミングで起動する場合は isEnabledfalse を指定します。

手動でカメラを起動する手順を次に示します:

  1. 起動したいカメラに対応する AVCaptureDevice を取得します。

  2. 使用するフォーマットを決めます。 使用可能なフォーマットは format(width:height:for:frameRate:) で取得できます。

  3. 使用するフレームレートを決めます。 2. で取得したフォーマットと希望するフレームレートを maxFrameRate(_:for:) の引数に与えて実行すると、 その値を上限とする使用可能なフレームレートを取得できます。 もし 60fps を指定しても、フォーマットが対応する上限が 30fps であれば 30fps を返すので注意してください。

  4. start(format:frameRate:completionHandler:)) を実行してカメラを起動します。 起動処理の終了後、起動の成否に関わらず completionHandler: が実行されます。

カメラを停止・再起動する

映像の配信が終了すると、起動中のカメラも自動的に停止します。 (映像を配信しない場合でも CameraSettings.isEnabledtrue であれば停止します) 。 起動中のカメラを一時的に停止するには stop(completionHandler:) を実行します。 停止したカメラを再起動するには start(format:frameRate:completionHandler:)restart(completionHandler:) を実行します。 restart(completionHandler:) は停止前と同じ設定でカメラを再起動します。

起動中のカメラの設定を変更する

起動中のカメラのフォーマットとフレームレートは change(format:frameRate:completionHandler:) で変更できます。 このメソッドは指定した設定でカメラを再起動します。

カメラの位置を切り替える

カメラの前面と背面を切り替えるには flip(_:completionHandler:) 静的メソッドを実行します。 このメソッドは起動中のカメラの位置と反対のカメラを起動します。 このときに使われるフォーマットとフレームレートは、起動中のカメラの設定に近い値が検索されます。 任意の設定を使いたい場合は、起動中のカメラを停止してから任意のカメラを起動してください。

カメラの映像を加工する

CameraVideoCapturerHandlers イベントハンドラの onCapture を実装します (handlers プロパティでイベントハンドラにアクセスできます) 。 onCapture にセットするクロージャーはカメラの映像フレームを受け取り、ストリームに渡すための映像フレームを返す必要があります。

その他の操作

その他の操作は AVCaptureDevice を利用してください。

映像の描画

映像を描画する

ストリームが扱う映像は、ロールに関わらず VideoView (もしくは VideoRenderer プロトコルを実装したオブジェクト) で描画可能です。

サンプルコードを次に示します:

@IBOutlet weak var videoView: VideoView!

// 接続する
Sora.shared.connect(configuration: config) {
    chan, error in
    // エラー処理は省略
    ...

    // VideoView をセットする
    chan!.mainStream.videoRenderer = self.viedoView
}

1 つのストリームにセットできる VideoView は 1 つです。 マルチストリーム機能ではストリームごとに異なる VideoView をセットする必要があります。

Interface Builder で VideoView を配置する

Interface Builder で VideoView をウィンドウに配置する場合は、次の手順で設定します。

  1. ウィンドウに UIView を配置する

  2. インスペクタを開き、 "Custom Class" の次の設定を変更する

  • "Class": "VideoView" を指定する

  • "Module": "Sora" を指定する

_images/videoview_customclass.png
独自の映像レンダラーを実装する

VideoView 以外の映像レンダラーを独自に実装したい場合は、 VideoRenderer プロトコルを実装したクラスを用意します。

映像フレームを加工・編集する

映像フレーム (VideoFrame) は映像レンダラーに渡される前のタイミングで加工・編集が可能です。 加工・編集を行うには VideoFilter プロトコルを実装したクラスのオブジェクトを、ストリームの videoFilter プロパティにセットして使用します。

映像フレームは CMSampleBuffer から生成可能です (音声データを含む CMSampleBuffer は非対応です) 。 詳しくは API リファレンスを参照してください。

任意の映像を送信する

任意の映像を送信するには、映像フレームを生成して配信ストリームの send(videoFrame:) メソッドの引数に渡します。

映像の送受信の停止時の描画について

ストリームによる映像の送受信が停止したときの VideoView の挙動は 未定義 です。

現在、弊社の SDK ではプラットフォームによって映像ビューの挙動が異なることを確認しています。 iOS では映像が止まったように見え、 Android とブラウザでは黒い画面が表示されます。 これらの現象は WebRTC ライブラリの実装に依存しており、各種 Sora SDK では特に手を加えていません。

Sora iOS SDK で仕様を定めない理由は次の通りです。

  • WebRTC は映像の送受信の停止時の描画について定義していません。

  • 映像の送受信の停止時に描画コンポーネントがすべき挙動はアプリケーションによって異なります。 あるアプリケーションでは黒い画面を表示したいかもしれませんし、他のアプリケーションでは最後に描画した映像を表示し続けたいかもしれません。

以上の理由から、 SDK は特定の挙動を保証していません。 映像の送受信の停止時の処理はユーザー側で実装して頂く必要があります。

最も単純な方法は、停止時の描画を行うビューを用意することです。 VideoView とは別にビューを用意しておき、停止時に切り替えます。 参考として切替の方法の例を次に挙げておきます。

  • 停止時に VideoView を隠し、用意したビューを表示します。基本的にこの方法を推奨します。

    // VideoView を隠す
    videoView.isHidden = true
    
    // 代わりのビューを表示する
    anotherView.isHidden = false
    
  • 停止時に表示するビューを VideoView のサブビューに追加します。黒い画面や画像などの単純な映像を表示したり、 VideoView の回転やリサイズに追従したりする場合に向きます。

    // 黒い画面を表示するビューを VideoView に追加する
    blackView = UIView(frame: videoView.bounds)
    blackView.backgroundColor = UIColor.black
    videoView.addSubview(blackView)
    
    // Auto Layout の設定
    blackView.translatesAutoresizingMaskIntoConstraints = false
    blackView.leadingAnchor.constraint(equalTo: videoView.leadingAnchor).isActive = true
    blackView.trailingAnchor.constraint(equalTo: videoView.trailingAnchor).isActive = true
    blackView.topAnchor.constraint(equalTo: videoView.topAnchor).isActive = true
    blackView.bottomAnchor.constraint(equalTo: videoView.bottomAnchor).isActive = true
    
    // 再開時はサブビューから取り除く
    blackView.removeFromSuperview()
    
端末の回転の検出について

Sora iOS SDK は、カメラの起動時に UIDevicebeginGeneratingDeviceOrientationNotifications() を、停止時に endGeneratingDeviceOrientationNotifications を実行します。これは libwebrtc のカメラ操作の仕様です。 アプリケーションで同メソッドを実行する際は、 beginGeneratingDeviceOrientationNotifications()endGeneratingDeviceOrientationNotifications() を必ず対に実行するように注意してください。

音声の操作

音声トラック毎に音量やミュートを設定する

1 つのコネクションに対して

音声をミュートする

音声をミュートするには メディアストリーム (MediaStream) の audioEnabled プロパティに false をセットします。 ただし送信音声についてミュートした場合、マイクは停止しませんので注意してください。

// 指定の ConnectionID を持つ受信 Stream の音声のミュート状態を切り替える
private func handleMuteReceiveStream(connectionId: String) {
    // 受信したストリームのリストを取得する
    // Sora 接続成功時に取得する MediaChannel を mediaChannel に保持しているものとする
    let downstreams = mediaChannel?.receiverStreams ?? []
    // downstreams が空の場合は何もしない
    guard downstreams.count > 0 else {
        return
    }
    for stream in downstreams {
        // 指定のコネクションIDを持つ Stream の audioEnabled を切り替える
        if stream.streamId == connectionId {
            stream.audioEnabled = !stream.audioEnabled
        }
    }
}
受信した音声の音量を変更する

ロールRole.recvonly または Role.sendrecv のとき、 メディアストリーム (MediaStream) の remoteAudioVolume プロパティで受信ストリームの音量が変更できます。 このプロパティは 0 から 10 の値をとります。 0 をセットすると音声は出力されません。

送信ストリームで送信する音声の音量は変更できません。

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

// 送信または受信のストリームが追加されたときのイベントハンドラ
config.mediaChannelHandlers.onAddStream = { [weak self] stream in
    // クロージャーの実行時、 self が存在する場合のみ処理を続けます。
    guard let self = self else {
        return
    }
    // 受信ストリームのときのみ音量変更を行う
    if stream.streamId != config.publisherStreamId {
        stream.remoteAudioVolume = 3.0
    }
}
任意の音声を送信する

WebRTC ライブラリの制約により、 Sora iOS SDK ではマイク入力以外の音声を送信できません。ご了承ください。

AVAudioSession のプロパティを変更する

重要

iOS 14.0 で、音声モードをデフォルト以外からデフォルトに戻したときに音声が出力されない事象を確認しています。その場合は端末を iOS 14.1 以降にアップデートしてください。

Sora iOS SDK では、AVAudioSession のプロパティを変更する簡易的な API として、 Sora.setAudioMode メソッド を用意しています。

この API は AVAudioSession の次のプロパティを変更します

  • 音声モード (AVAudioSession.Mode)

  • 音声カテゴリ (AVAudioSession.Category)

  • 音声カテゴリオプション (AVAudioSession.CategoryOptions)

  • 音声経路 (AVAudioSession.PortOverride)

ピア接続の設定や端末の状況によっては設定が反映されない場合があるので注意してください。

Sora.setAudioMode メソッド の型と引数は以下の通りです。

  • mode: AudioMode

    • AudioMode は Sora iOS SDK で利用可能な 3 種類の音声モードです。

      • default

        • default の音声モードを利用します。音声カテゴリ、音声出力先の指定ができます。

      • videoChat

        • videoChat の音声モードを利用します。音声カテゴリは playAndRecord、音声出力先はスピーカーを使用します

      • voiceChat

        • voiceChat の音声モードを利用します。音声カテゴリは playAndRecord、音声出力先の指定ができます。

  • options: AVAudioSession.CategoryOptions

    • 指定は任意です。デフォルトで allowBluetoothallowBluetoothA2DPallowAirPlay が設定されています。

    • 指定した場合はデフォルトの音声カテゴリオプションは設定されず、指定した音声カテゴリオプションのみが設定されます。

AudioMode の指定方法および AVAudioSession のプロパティ設定内容

AudioMode はモード毎にそれぞれ異なる引数を取ります。 指定する引数の内容と、指定された引数によって設定される AVAudioSession のプロパティの値は以下のとおりです。

  • default(category: AVAudioSession.Category, output: AudioOutput)

    • 音声モードに default を設定します

    • 音声カテゴリに引数で指定された category を設定します

    • output には AudioOutputdefault または speaker を指定します

      • output に speaker が指定されていた時、音声カテゴリオプションに defaultToSpeaker が追加で設定されます

  • videoChat

    • 音声モードに videoChat が設定されます

    • 音声カテゴリに playAndRecord が設定されます

  • voiceChat(output: AudioOutput)

    • 音声モードに voiceChat を設定します

    • 音声カテゴリに playAndRecord を設定します

    • output には AudioOutputdefault または speaker を指定します

      • output に speaker が指定されていた時、音声カテゴリオプションに defaultToSpeaker が追加で設定されます

      • output に speaker が指定されていた時、音声経路に speaker が設定されます

設定例

以下に Sora.setAudioMode メソッド を利用した AVAudioSession のプロパティ変更の例を示します。

import Sora
// 接続時のコールバック onConnect で音声モードを変更する
config.mediaChannelHandlers.onConnect = { [weak self] _ in

    // setAudioMode を利用して、AVAudioSession のプロパティを変更する
    // AudioSeesion は以下のように設定される
    //   - Category : playAndRecord
    //   - Mode : default
    //   - CategoryOptions : defaultToSpeaker, allowBluetooth, allowBluetoothA2DP, allowAirPlay
    //     - output に speaker を設定することで defaultToSpeaker が設定される
    //     - options は未指定のときと同様の設定。ここでは設定方法の例として記載している。
    let result = Sora.shared.setAudioMode(.default(category: .playAndRecord, output: .speaker), options: [.allowBluetooth, .allowBluetoothA2DP, .allowAirPlay])

    // 必要に応じてエラーハンドリングを行う
    switch result {
    case .success():
       // 成功
    case .failure(let error):
       // 失敗
    }
}

さらに細かい設定を行う場合は AVAudioSession の継承クラスである libwebrtc の RTCAudioSession を使用して設定が可能です。 設定を行った結果、libwebrtc の動作に影響が出て、正常に動作しなくなる可能性があるため、libwebrtc の挙動を理解した上で設定をしてください。

音声モードを変更するタイミング

音声モードの変更は 接続完了後 に行ってください。 Sora iOS SDK は接続完了時に接続設定に従って音声カテゴリを変更するので、接続完了前にセットした音声モードは接続完了時に上書きされます。

その他の操作

音声の出力は AVAudioSession により管理されているため、その他の操作は AVAudioSession を利用してください。

マイクのパーミッションについて

マイクのパーミッションは配信時にのみ要求されます。 マイクを使う場合は、 必ず Info.plist にマイクの用途を記述してください。

リアルタイムメッセージング機能

概要

リアルタイムメッセージング機能は WebRTC の DataChannel を利用して、データの送受信を行う機能です。

詳細は Sora ドキュメント リアルタイムメッセージング機能 を参照してください。 また、サンプルアプリケーション を用意していますのでこちらも参考にしてください。

メッセージを送受信する
Sora 接続時にリアルタイムメッセージング用 DataChannel を設定する

Sora の 接続時に Configuration.dataChannels に リアルタイムメッセージング用 DataChannel を指定できます。 JSONSerialization で JSON に変換可能な形式で指定します。

// 接続の設定
var config = Configuration(url: soraURL,
                           channelId: soraChannelId,
                           role: role,
                           multistreamEnabled: true)

// DataChannel 経由のシグナリングを有効にする
config.dataChannelSignaling = true

// リアルタイムメッセージング機能に利用する DataChannel を指定する
config.dataChannels = [[
          "label": "#spam",
          "direction": "sendrecv",
      ], [
          "label": "#egg",
          "max_retransmits": 0,
          "ordered": false,
          "protocol": "abc",
          "compress": false,
          "direction": "recvonly",
          "header": [
              ["type": "sender_connection_id"]
          ],
]]
メッセージを受信する

Configuration.mediaChannelHandlers.onDataChannelMessage を利用してメッセージの受信を行います。バイナリデータ (Data 型) での受信になりますので適宜必要な型に変換してください。

// メッセージ受信時の処理をハンドラーに定義する
config.mediaChannelHandlers.onDataChannelMessage = { (mediaChannel, label, data) in
  // label をチェックする
  guard label.starts(with: "#spam") else {
    return
  }
  ...
}
受信したメッセージをヘッダーとメッセージに分割する

リアルタイムメッセージングにヘッダーが追加されている場合、onDataChannelMessage で受け取るデータにはヘッダーとメッセージが結合された状態で入っています。 これを分離するには Configuration.mediaChannelHandlers の onReceiveSignalingonDataChannelMessage を利用して以下のように処理します。

// dataChannels の label ごとにヘッダーの長さを保持するための変数
var headerLengths: [String: Int] = [:]

// offer で入ってくる data channel header の長さを取得する
config.mediaChannelHandlers.onReceiveSignaling = { [weak self] signaling in
    guard let self else {
        return
    }
    switch signaling {
    case let .offer(offer):
        guard let dataChannels = offer.dataChannels else {
            return
        }
        for dataChannel in dataChannels {
            // ラベルが "#" で始まる場合のみ処理する
            let label: String = dataChannel["label"] as! String
            guard label.starts(with: "#") else {
                continue
            }

            // dataChannel["header"] が nil ではない場合のみ後続処理を行う
            guard let headers = dataChannel["header"] as? [[String: Any]] else {
                continue
            }
            for header in headers {
                if header["type"] as! String == "sender_connection_id" {
                    let length = header["length"] as! Double
                    headerLengths[label] = Int(length)
                    print("kensaku: \(label) \(Int(length))")
                }
            }
        }
    default:
        break
    }
}

// メッセージ受信時の処理を定義する
config.mediaChannelHandlers.onDataChannelMessage = { [weak self] _, label, data in
    guard let self = self else {
        return
    }

    // "#" で始まるラベル以外は無視する
    guard label.starts(with: "#") else {
        return
    }

    // ヘッダーの長さを取得し、ヘッダーとメッセージを分離する
    let headerLength = self.headerLengths[label] ?? 0
    if headerLength == 0 {
        print(String(data: data, encoding: .utf8) ?? data.map(\.description).joined(separator: ", "))
        return
    }
    let header = data.prefix(headerLength)
    let message = data.suffix(from: headerLength)
    ...
}
メッセージを送信する

MediaChannel.sendMessage を利用してメッセージの送信を行います。バイナリデータ (Data 型) の送信のみ可能です。文字列を送信したい場合はバイナリデータに変換してください。

// メッセージを送信する
// type: switched を受信した後からメッセージが送信できる
let error = mediaChannel.sendMessage(label: "#spam", data: "egg".data(using: .utf8)!)
guard error == nil else {
    // エラー処理
    ...
    return
}

開発ガイド

Sora iOS SDK 全般
Sora iOS SDK の構成要素

Sora iOS SDK は次の要素を中心に構成されます。

メディアチャネル

メディアチャネル ( MediaChannel ) は WebRTC のメディアチャネルを表します。 Sora iOS SDK ではメディアチャネルの ID を指定して Sora に接続します。

ロール

ロール (Role) はメディアチャネルが扱う音声と映像の送受信の方向を表します。 ロールは接続 1 つにつき 1 つです。ロールの種類を次に示します。

  • 送信のみ (Role.sendonly) は端末の音声と映像を Sora に送信します。

  • 受信のみ (Role.recvonly) は Sora から音声と映像を受信します。

  • 送受信 (Role.sendrecv) は送信と受信の両方を行います。

メディアストリーム

メディアストリーム ( MediaStream ) は音声と映像のストリームを表すオブジェクトです。 マルチストリーム機能では同チャネルへの接続数と同じ数のストリームが使用されます。

メディアストリームの取得方法は 2 種類あります。

  1. メディアチャネル ( MediaChannel ) のプロパティから取得する

Sora への接続後、 MediaChannel の以下のプロパティより接続中の MediaStream の取得が行えます

  • streams: 全てのメディアストリームのリスト

  • senderStream: 送信されるメディアストリーム

  • receiverStreams: 受信したメディアストリームのリスト

  • mainStream: 先頭のメディアストリーム

    • 単一映像を受信のみするケース、単一映像を送信のみするケースでの利用を想定しています

  1. メディアチャネル ( MediaChannel ) のイベントハンドラから取得する

Sora への接続後、 MediaChannel のイベントハンドラである MediaChannelHandlers より追加、または削除された MediaStream の取得が行えます

  • onAddStream: 追加されたメディアストリーム

  • onRemoveStream: 削除されたメディアストリーム

映像ビュー

映像ビュー (VideoView) はメディアストリームの音声と映像を描画するビューオブジェクトです。いずれのロールの映像も描画できます。

SDK のログをコンソールに出力する

Loggerlevel プロパティでログレベルの指定が可能です。 デフォルトのログレベルは .info です。

例: デバッグログを出力する

Logger.shared.level = .debug
WebRTC
WebRTC ライブラリのバージョンを知りたい

WebRTCInfoversion プロパティで Sora iOS SDK が使用する WebRTC のバージョンを取得できます。 メジャーバージョンがリリースブランチを表します。

WebRTC ライブラリの API を使う

WebRTC ライブラリの API (接頭辞が RTC のもの) を使うには、 WebRTC フレームワークをインポートする必要があります。 ファイルの先頭に import WebRTC を記述してください。

WebRTC ライブラリのログをコンソールに出力する

WebRTC の挙動について Sora iOS SDK より詳細なログを出力したい場合は、 Sora オブジェクトの setWebRTCLogLevel() を使ってログレベルを指定します。

// 最も詳細なログを表示する
Sora.setWebRTCLogLevel(.verbose)
メディア制約を指定する

メディア制約は MediaConstraints で表されます。 MediaConstraintsWebRTCConfigurationconstraints プロパティにセットすることでメディア制約を指定可能です。

ICE サーバーの URL を指定する

ICE サーバーの情報は ICEServerInfo で表されます。 サーバーの URL をセットした ICEServerInfoWebRTCConfigurationiceServerInfos プロパティに指定します。

シグナリング
メタデータを指定する

任意の JSON 値の送受信 を参照してください。

送受信されたシグナリングの内容を確認する

シグナリングの内容はデバッグログを有効にするとコンソールに出力されます。 設定方法は SDK のログをコンソールに出力する を参照してください。

接続
Sora に接続する

大まかな手順を次に示します。 Sora に接続する も参考にしてください。

  1. Configuration を生成します。Sora のシグナリング URL 、チャネル ID 、ロールをセットします。

  2. Sora オブジェクトの connect(configuration:webRTCConfiguration:handler:) を実行します。実行後は handler: に渡したブロックが実行されます。

  3. 接続が成功するとストリームが生成されます。このストリームは mainStream プロパティでアクセスできます。

マルチストリーム機能を有効にして接続する

詳しくは マルチストリーム機能 を参照してください。

接続試行時のタイムアウトを設定する

接続試行時のタイムアウトまでの秒数は、 ConfigurationconnectionTimeout プロパティで指定可能です。 connect(configuration:webRTCConfiguration:handler:) で接続が成立せずにタイムアウトになると、 handler ラベルに指定したブロックが実行されます。 このとき、ブロックの引数にタイムアウトを示すエラー (SoraError.connectionTimeout) が渡されます。

接続試行をキャンセルする

接続試行中に処理をキャンセルしたい場合は、 connect(configuration:webRTCConfiguration:handler:) の戻り値である ConnectionTask オブジェクトの cancel() を実行します。 すでに接続済み、またはキャンセル済みの場合は何も起こりません。

再接続を行う

予期しない原因で接続が解除されたときに再接続を行いたい場合は、接続解除を検知する onDisconnectHandler イベントハンドラを利用して実装可能です。

次に MediaChannel のイベントハンドラを使う例を示します:

mediaChannel.handlers.onDisconnectHandler = { error in
    // 予期しない接続解除の場合のみ再接続する
    if error != nil {
        // 10 秒後に再接続する
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 10) {
            Sora.shared.connect(configuration: configuration) { chan, error in
                ...
            }
        }
        return
    }
}

再接続を実装する際は次の点に注意してください:

  • この方法による再接続とは「新しい接続」であり、接続解除前の状態を引き継ぐものではないので注意してください。 Sora は再接続に対応していません。

  • 同一のチャネル ID に再接続する場合、再接続を行うまでの時間が短いと、シグナリング時にチャネル ID 重複エラー (DUPLICATED-CHANNEL-ID) が発生する可能性があります。 このエラーが頻発する場合は、ある程度時間を空けてから再接続を行ってください。 現在の Sora の仕様では、待ち時間は Sora の稼働状況に依存します。 運用の仕方に応じて待ち時間を調節してください。

イベントハンドラを使用する

Sora iOS SDK は次のイベントハンドラを提供しています。 詳しくは API リファレンス を参照してください。

  • WebSocket (WebSocketHandlers)

  • メディアストリーム (MediaStreamHandlers)

  • メディアチャネル (MediaChannelHandlers)

配信ストリームを取得する

配信ストリーム (端末のカメラとマイクのメディアデータを送信するストリーム) は MediaChannelsenderStream プロパティで取得できます。

受信ストリームのリストを取得する

受信ストリームのリストは MediaChannelreceiverStreams プロパティで取得できます。

受信ストリームに紐づく Sora のコネクション ID を取得する

MediaStreamstreamId プロパティにはストリームを送信したクライアントのコネクション ID が設定されています。 受信した MediaStreamMediaChannelreceiverStreams プロパティや、 MediaChannel のイベントハンドラである MediaChannelHandlers から取得できます。

映像と音声
映像と音声の可否を指定する

映像なら ConfigurationvideoEnabled プロパティ、音声なら audioEnable プロパティで指定可能です。

映像・音声コーデックを指定する

映像コーデックなら ConfigurationvideoCodec プロパティ、音声コーデックなら audioCodec プロパティで指定可能です。

映像ビットレートを指定する

ConfigurationvideoBitRate プロパティで指定可能です。

送受信された映像を描画する

映像は VideoView で描画できます。 VideoView をストリームの videoRenderer プロパティにセットします。 詳しくは 映像を描画する を参照してください。

サンプルコード:

let config = Configuration(url:
    URL(string: "ws://192.168.0.2:5000/signaling")!,
                           channelId: "soraapp",
                           role: .sendonly,
                           multistreamEnabled: false)
Sora.shared.connect(configuration: config) { chan, error in
    if let error = error {
        // エラー処理
        return
    }

    // VideoView をストリームにセット
    chan!.mainStream?.videoRenderer = self.videoView
}
映像フレームを加工・編集する

映像フレームを加工・編集する を参照してください。

Interface Builder で VideoView を配置する

ウィンドウに View コンポーネントを配置し、インスペクタの Custom Class の "Class" に "VideoView" を、 "Module" に "Sora" を指定します。

_images/videoview_customclass.png
音声をミュートする、音量を変更する

音声の操作 を参照してください。

映像と音声の送受信を一時的に停止する

接続中に映像または音声の送受信を一時的に停止・再開するには、 MediaStream の次のプロパティを利用します。

  • 映像の停止と再開: videoEnabled プロパティ

  • 音声の停止と再開: audioEnabled プロパティ

それぞれのプロパティに false をセットすると、送受信を停止します。 true をセットすると送受信を再開します。

任意の音声を送信したい

WebRTC ライブラリの制約により、 Sora iOS SDK ではマイク入力以外の音声を送信できません。ご了承ください。

カメラとマイク
カメラとマイクを初期化する

映像送信時、 Sora への接続に成功すると、端末のカメラとマイクが自動的に準備されます。 必ず事前に Info.plist の設定 をしておいてください。 無設定だとアプリケーションが強制終了します。

マイクをミュートする

Sora iOS SDK ではマイクをミュートする API を用意していません。 AVAudioSession などを利用してください。

カメラ(マイク)のアクセス権をユーザーに要求しない

カメラ(またはマイク)の初回起動時は、カメラとマイクへのアクセス権を求めるダイアログが表示されます。 ダイアログの表示に関しては次の制限があります。

  • 使わないデバイスのダイアログを非表示にできない。 映像のみ、または音声のみの利用であっても、カメラとマイクに関する 2 つのダイアログが表示されます。 これは libwebrtc の仕様であり、 Sora iOS SDK では変更できません。

  • ダイアログを表示するタイミングを制御できない。 ダイアログはカメラやマイクへのアクセスがあると起動されますが、アクセスがなくても表示される場合があります。 これは libwebrtc の仕様であり、 iOS の仕様です。

メモリ管理の注意点

イベントハンドラと循環参照

Sora iOS SDK の各種イベントハンドラをセットする際は、クロージャーにキャプチャーされる変数の循環参照に気をつけてください。 強参照で保持される循環参照はメモリリークの原因になる可能性があります。

以下にメモリリークを回避する例を示します:

class ViewController: UIViewController {

    func connect() {
        let config = Configuration(url: url,
                                   channelId: channelId,
                                   role: .sendrecv,
                                   multistreamEnabled: true)

        // イベントハンドラに渡す self を弱参照にしておくことで本オブジェクトの循環参照を回避します。
        // 強参照にする場合、本オブジェクトがどこからも参照されなくなっても
        // 解放されずにメモリに残り続けてしまう可能性があります。
        config.mediaChannelHandlers.onAddStream = { [weak self] stream in
            // クロージャーの実行時、 self が存在する場合のみ処理を続けます。
            guard let self = self else {
                return
            }
            if stream.streamId != config.publisherStreamId {
                stream.videoRenderer = self.receiverVideoView
            }
        }
    }

}

トラブルシューティング

ビルド
Xcode
"Use of undeclared type 'xxx'" または "'xxx' is unavailable: cannot find Swift declaration for this class"

Sora モジュールをインポート (import Sora) しているにも関わらず、次のエラーでビルドできない場合があります。

  • Use of undeclared type 'xxx'

  • 'xxx' is unavailable: cannot find Swift declaration for this class

これらのエラーは、次のいずれかの状況で発生します。

  • Sora iOS SDK がサポートしていないアーキテクチャをビルドのターゲットに含めている

  • リンクする Sora iOS SDK のバージョンに存在しない API を使っている

これらのエラーが発生したら、次の方法を試してください。

  • Sora iOS SDK を最新版にアップデートする。

  • ビルドのターゲットにシミュレーターを指定しないか確認する。 Sora iOS SDK はシミュレーターをサポートしていません。

  • プロジェクトの "Build Settings" の "Valid Architectures" で指定しているアーキテクチャを確認する。 Sora iOS SDK がサポートするアーキテクチャは "armv7" と "arm64" のみです。

実行
アプリケーションが強制終了する

SDK を組み込んだアプリケーションが強制終了する場合、1 つの原因として Info.plist ファイルにカメラとマイクの用途が記述されていない可能性があります。 Info.plist にカメラとマイクの用途を記述しているかどうか確認してください。

起動時に次のログが表示される: "One of the two will be used."

アプリケーションを iOS 12 以降のデバイスで起動すると次のログが出力されます。

/private/var/containers/Bundle/Application/C1E5D7C0-076A-41E3-831A-C4911C2ABB3D/MyApp.app/MyApp
objc[28847]: Class RTCCVPixelBuffer is implemented in both /System/Library/PrivateFrameworks/WebCore.framework/Frameworks/libwebrtc.dylib (0x261598018) and /private/var/containers/Bundle/Application/C1E5D7C0-076A-41E3-831A-C4911C2ABB3D/MyApp.app/Frameworks/WebRTC.framework/WebRTC (0x104ce9af8). One of the two will be used. Which one is undefined.
objc[28847]: Class RTCWrappedNativeVideoDecoder is implemented in both /System/Library/PrivateFrameworks/WebCore.framework/Frameworks/libwebrtc.dylib (0x25f453468) and /private/var/containers/Bundle/Application/C1E5D7C0-076A-41E3-831A-C4911C2ABB3D/MyApp.app/Frameworks/WebRTC.framework/WebRTC (0x104ce9b48). One of the two will be used. Which one is undefined.
objc[28847]: Class RTCWrappedNativeVideoEncoder is implemented in both /System/Library/PrivateFrameworks/WebCore.framework/Frameworks/libwebrtc.dylib (0x25f4534b8) and /private/var/containers/Bundle/Application/C1E5D7C0-076A-41E3-831A-C4911C2ABB3D/MyApp.app/Frameworks/WebRTC.framework/WebRTC (0x104ce9b98). One of the two will be used. Which one is undefined.
objc[28847]: Class RTCVideoDecoderVP8 is implemented in both /System/Library/PrivateFrameworks/WebCore.framework/Frameworks/libwebrtc.dylib (0x25f4531c0) and /private/var/containers/Bundle/Application/C1E5D7C0-076A-41E3-831A-C4911C2ABB3D/MyApp.app/Frameworks/WebRTC.framework/WebRTC (0x104ce9c10). One of the two will be used. Which one is undefined.

このログは、 Sora iOS SDK が利用する WebRTC ライブラリのバイナリと組み込みのバイナリとの競合を示しています。

iOS 12 以降のデバイスでは WebRTC ライブラリが組み込まれるようになり、 アプリケーションを起動すると組み込みの WebRTC ライブラリがロードされます。 同時に Sora iOS SDK が利用する WebRTC ライブラリもロードされるので、同じライブラリが重複してしまいます。 そのため iOS はどちらか一方のライブラリのみを使用しますが、選択結果はわかりません (公式ドキュメントにも具体的な記述はありません) 。 ただし、 Sora iOS SDK の WebRTC ライブラリが使われていることは確認していますので、特に動作に問題はありません。

接続
Sora に接続できない

まずは wscat などのツールで WebSocket の接続の成否を確認してください。 wscat であれば次のコマンドで接続の成否を確認できます:

$ wscat --connect [URL]

もし接続できなければ URL を確認してください。

  • プロトコルは "ws" または "wss" のどちらかを指定していますか? Sora iOS SDK のシグナリングは WebSocket のみ対応しています。

  • ポート番号に間違いはありませんか? "wss" であれば通常は 443 です。

  • パスに signaling を指定していますか?指定されているなら、パスの末尾を確認してください。 パスの末尾が / だと接続に失敗します。

URL に問題がないのに WebSocket 接続ができない場合は、 Sora の設定やネットワーク環境を確認してください。

モバイルデータ通信の接続解除時に MediaChannelHandlers.onDisconnect() が呼ばれない (古いバージョンの iOS 14)

古いバージョンの iOS 14 にてモバイルデータ通信の接続解除時に MediaChannelHandlers.onDisconnect() イベントハンドラが呼ばれない現象を確認しています。 最新版の iOS での発生は確認されていません。

この現象は標準の WebSocket API が影響している可能性があります。 Sora iOS SDK 2020.4 以降では、端末の iOS のバージョンが 13 以降の場合に標準 API を使って WebSoket 通信を行います。 iOS のバージョンが 13 以前の場合はサードパーティーの WebSocket ライブラリ (Starscream) を使うようになっています。

この現象に遭遇した場合、サードパーティーの WebSocket ライブラリを試してみてください。 ConfigurationallowsURLSessionWebSocketChannel プロパティを false に設定すると、標準 API の代わりにサードパーティーの WebSocket ライブラリが使われます。

例:

config.allowsURLSessionWebSocketChannel = false
配信
iOS から H.264/FHD で配信した映像が他の端末で受信できない

iOS 端末から FHD で配信したい場合は H.264 のプロファイルレベル ID を設定してください。設定は以下の方法で行うことができます。

  • Configuration.videoH264Params を設定する

  • Sora の設定を変更する

Sora の設定については Sora ドキュメント sora.conf リファレンス をご確認ください。 プロファイルレベル ID を変更しない場合は H.264 の HD 以下で配信するか、他のコーデックを使用して FHD 配信をしてください。

API リファレンス

API の詳細はこちらの API リファレンス を参照してください。

古いリリースノート

CHANGE

後方互換性のない変更

UPDATE

後方互換性がある変更

ADD

後方互換性がある追加

FIX

バグ修正

2022.6.0
日付:

2022-09-14

対応 Sora:

2022.1.1

対応 iOS:

13.0 以降

対応 libwebrtc:

m105.5195.0.0

  • [CHANGE] bitcode を無効化しました

    • libwebrtc 105.5195.0.0 より bitcode が含まれなくなりました。bitcode を無効にしてビルドをする必要があります

    • bitcode を含めてアプリケーションをビルドする必要がある場合は一つ前の 2022.5.0 をご利用ください

  • [CHANGE] 対応アーキテクチャについて x86_64 を廃止しました

    • libwebrtc 105.5195.0.0 より macOS x86_64 のビルドが廃止されたことに伴う変更です

  • [UPDATE] WebRTC 105.5195.0.0 に対応しました

  • [UPDATE] システム条件を変更しました

    • macOS 12.6 以降

    • Xcode 14.0

    • Swift 5.7

    • CocoaPods 1.11.3 以降

2022.5.0
日付:

2022-08-04

対応 Sora:

2022.1.1

対応 iOS:

13.0 以降

対応 libwebrtc:

m104.5112.8.0

  • [UPDATE] WebRTC 104.5112.8.0 に対応しました

  • [ADD] 接続時に HTTP プロキシの設定を追加できるようにしました

2022.4.0
日付:

2022-06-29

対応 Sora:

2022.1.0

対応 iOS:

13.0 以降

対応 libwebrtc:

m103.5060.4.0

  • [CHANGE] mid を必須とする対応を行いました

    • この修正の結果、 type: offer に mid が含まれない場合は、エラーになります

    • 最新版の Sora をご利用の場合は必ず mid が設定されます

  • [CHANGE] Configuration.spotlightEnabled == .enabled の際に、自動的にサイマルキャストを有効化しない変更を行いました

  • [UPDATE] システム条件を変更しました

    • macOS 12.3 以降

    • WebRTC SFU Sora 2022.1 以降

  • [UPDATE] WebRTC 103.5060.4.0 に対応しました

  • [ADD] Sora の bundle_id に対応しました

    • Configuration.bundleId を追加しました

2022.3.0
日付:

2022-06-10

対応 Sora:

2021.2.8

対応 iOS:

13.0 以降

対応 libwebrtc:

m102.5005.7.6

  • [UPDATE] システム条件を変更しました

    • Xcode 13.4

    • Swift 5.6.1

  • [UPDATE] WebRTC 102.5005.7.6 に対応しました

  • [UPDATE] offer に mid が含まれる場合は、 mid を利用して sender を設定する

  • [FIX] CocoaPods 利用時 App Store Connect に bitcode を有効にしてバイナリをアップロードするとエラーになる問題を解消しました。

    • WebRTC 102.5005.7.6 ビルドにて対応しているため iOS SDK 本体の修正はありません

2022.2.1
日付:

2022-04-22

対応 Sora:

2021.2.8

対応 iOS:

13.0 以降

対応 libwebrtc:

m97.4692.4.0

  • [FIX] CocoaPods 利用時 App Store Connect に bitcode を有効にしてバイナリをアップロードするとエラーになる問題が発生しました。暫定回避策として、 WebRTC 97.4692.4.0 に下げています。

    • 最新のバージョンにて解消しております。

2022.2.0
日付:

2022-03-11

対応 Sora:

2021.2.1

対応 iOS:

13.0 以降

対応 libwebrtc:

m99.4844.1.0

  • [CHANGE] DataChannel 経由で受信したメッセージのうち label が signaling, push, notify について MediaChannelHandlers.onReceiveSignaling で通知する処理を追加しました

  • [CHANGE] MediaChannel.connectedUrl を更新するタイミングを修正しました

    • type: connect を送信するタイミングで MediaChannel.connectedUrl を更新していたものを、 type: offer を受信したタイミングで値を更新するように変更しました

  • [UPDATE] WebRTC 99.4844.1.0 に対応しました

  • [ADD] メッセージング機能を追加しました

  • [ADD] MediaChannel.contactUrl を追加しました

    • MediaChannel.contactUrl は、複数のシグナリング候補の中から最初に type: connect メッセージを送信した Sora のシグナリング URL です

2022.1.1
日付:

2022-03-04

対応 Sora:

2021.2.1

対応 iOS:

13.0 以降

対応 libwebrtc:

m98.4758.0.0

  • [FIX] Sora との接続確立後に WebSocket のエラーが発生した場合、 エラーが正しく伝搬されず、終了処理が実行されない問題を修正しました

2022.1.0
日付:

2022-02-03

対応 Sora:

2021.2.0

対応 iOS:

13.0 以降

対応 libwebrtc:

m98.4758.0.0

  • [CHANGE] スポットライトレガシーを削除しました

  • [CHANGE] WebSocketChannel プロトコルを廃止しました

    • Configuration.webSocketChannelType を廃止しました

    • Configuration.allowsURLSessionWebSocketChannel を廃止しました

    • WebSocketChannelHandlers.onDisconnect を廃止しました

    • WebSocketChannelHandlers.onPong を廃止しました

    • WebSocketChannelHandlers.onSend を廃止しました

    • MediaChannel.webSocketChannel を廃止しました

    • WebSocketChannelHandlers を廃止しました

  • [CHANGE] Starscream を削除して、 URLSessionWebSocketTask をデフォルトで使用する対応を行いました

  • [CHANGE] サポートする iOS のバージョンを13以上に変更しました

  • [CHANGE] MediaChannel.native の型を RTCPeerConnection から RTCPeerConnection? に変更しました

    • PeerChannel で force unwrapping している箇所を修正する際に、併せて修正しました

  • [UPDATE] システム条件を変更しました

    • macOS 12.2 以降

    • Xcode 13.2

    • Swift 5.5.2

  • [UPDATE] WebRTC 98.4758.0.0 に対応しました

  • [UPDATE] MediaStream から MediaChannel にアクセスできるようにしました

  • [ADD] 複数シグナリング URL の指定に対応しました

  • [ADD] type: rediret に対応しました

  • [FIX] CameraVideoCapturer で force unwrapping していた箇所を修正しました

  • [FIX] VideoView に debugMode = true を設定した際にメモリー・リークが発生する問題を修正しました

2021.x
2021.3.1
日付:

2022-01-05

対応 Sora:

2021.2.0

対応 iOS:

12.1 以降

対応 libwebrtc:

m95.4638.3.0

  • [FIX] RTCPeerConnectionState.failed に遷移した際の切断処理中にクラッシュする問題を修正しました

    • BasicPeerChannelContextPeerChannel の循環参照を防ぐために弱参照を利用していましたが、それが原因で BasicPeerChannelContext より先に PeerChannel が解放されるケースがあり、クラッシュの原因となっていました

  • [FIX] DataChannel クラスで利用しているデータ圧縮/復号処理にメモリー・リークがあったので修正しました

2021.3.0
日付:

2021-11-25

  • [CHANGE] PeerChannel, SignalingChannel protocol を削除しました

    • Configuration.peerChannelType を廃止しました

    • Configuration.signalingChannelType を廃止しました

    • Configuration.peerChannelHandlers を廃止しました

    • Configuration.signalingChannelHandlers を廃止しました

    • MediaChannel.native を追加しました

    • MediaChannel.webSocketChannel を追加しました

  • [UPDATE] システム条件を変更しました

    • macOS 12.0 以降

    • Xcode 13.1

    • Swift 5.5

    • CocoaPods 1.11.2

  • [UPDATE] WebRTC 95.4638.3.0 に対応しました

  • [ADD] DataChannel シグナリングに対応しました

    • Configuration.dataChannelSignaling を追加しました

    • Configuration.ignoreDisconnectWebSocket を追加しました

  • [FIX] Sora 接続時に audioEnabled = false を設定すると answer 生成に失敗してしまう問題についてのワークアラウンドを削除しました

2021.2.1
日付:

2021-09-29

  • [FIX] Swift Package Manager に対応するためバージョニングを修正しました

2021.2
日付:

2021-09-29

  • [CHANGE] 接続開始時のカメラ・デバイスを指定可能にしました

    • Configuration.cameraSettings.position.front または .back を設定して、接続開始時のカメラ・デバイスを指定します

    • この修正に伴い、以下の API が変更されました

      • CameraVideoCapturer の API を破壊的に変更しました

      • CameraVideoCapturer.SettingsCameraSettings にリネームしました

      • VideoCapturerHandlersCameraVideoCapturerHandlers にリネームしました

      • VideoCapturer を廃止しました

      • VideoCapturerDevice を廃止しました

      • CameraPosition を廃止しました

      • Configuration.videoCapturerDevice を廃止しました

      • MediaStream.videoCapturer を廃止しました

  • [UPDATE] Swift Package Manager に対応しました

  • [UPDATE] WebRTC 93.4577.8.0 に対応しました

  • [UPDATE] システム条件を変更しました

    • iOS 12.1 以降

  • [UPDATE] Starscream のバージョンを 4.0.4 に更新しました

  • [UPDATE] シグナリング・メッセージ re-offer, re-answer に対応しました

  • [UPDATE] AES-GCM を有効にしました

  • [UPDATE] SoraDispatcher を追加しました

    • libwebrtc 内部で利用されているディスパッチ・キューをラップし、 SDK のユーザーから利用しやすくしました

  • [FIX] 接続、切断の検知に RTCPeerConnectionState を参照するように変更しました

  • [FIX] 接続終了後に MediaChannel のメモリーが解放されずに残り続ける事象を修正しました

2021.1
日付:

2021-06-24

  • [CHANGE] スポットライトに関する API を変更しました

    • Sora のスポットライトレガシー機能を利用するための API を Sora.useSpotlightLegacy() に変更しました

    • Configuration.activeSpeakerLimit を非推奨にして、 Configuration.spotlightNumber に変更しました

    • Configuration.spotlightFocusRid を追加しました

    • Configuration.spotlightUnfocusRid を追加しました

  • [CHANGE] シグナリングに含まれる JSON 型のフィールドを JSONSerialization でデコードするようにしました

    • フィールドの型を SignalingMetadata から Any? に変更しました。任意の型にキャストして利用する必要があります

    • 対象のフィールド

      • SignalingNotifyConnection.metadata

      • SignalingOffer.metadata

      • SignalingPush.data

    • 修正にともない SignalingClientMetadataSignalingNotifyMetadata にリネームしました

  • [CHANGES] type: notify のシグナリング・メッセージに対応する struct として SignalingNotify を追加しました

    • event_type 毎に定義されていた以下の struct を廃止し SignalingNotify に統合しました

      • SignalingNotifyConnection

      • SignalingNotifySpotlightChanged

      • SignalingNotifyNetworkStatus

  • [CHANGE] サイマルキャストのオプションを Sora のアップデートへ追従しました

    • SimulcastQuality を削除し SimulcastRid を追加しました

    • Configuration.simulcastQuality を削除し simulcastRid を追加しました

    • SignalingConnect.simulcastQuality を削除し simulcastRid を追加しました

  • [CHANGE] DeviceModel を廃止し、 hw.machine の結果を表示するよう変更しました

  • [UPDATE] システム条件を変更しました

    • Xcode 12.5

    • Swift 5.4

    • CocoaPods 1.10.1

  • [UPDATE] サイマルキャストで VP8 / H.264 (ハードウェアアクセラレーション含む) に対応しました

  • [UPDATE] WebRTC 91.4472.9.1 に対応しました

  • [UPDATE] AV1 に対応しました

  • [ADD] libwebrtc のログレベルを設定する API を追加しました

    • Sora.setWebRTCLogLevel(_:)

  • [FIX] SignalingNotify に漏れていたフィールドを追加しました

    • SignalingNotify.authnMetadata

    • SignalingNotify.authzMetadata

    • SignalingNotify.data

    • SignalingNotify.turnTransportType

  • [FIX] サイマルキャストのパラメーター active: false が無効化されてしまう問題を修正しました

  • [FIX] WebSocketChannel 切断時に MediaChannel を切断する処理が漏れていたので追加しました

2020.x
2020.7.2
日付:

2021-05-26

  • [FIX] Sora 接続時に SDK から client_id が指定できない問題を修正しました

    • Configuration.clientId: 追加

2020.7.1
日付:

2021-01-08

  • [FIX] スポットライトレガシー機能に対応しました

  • [FIX] API: スポットライトに関する API について以下を変更しました

    • Configuration.Spotlight: 追加しました

    • Configuration.spotlightEnabled: 型を Spotlight に変更しました

2020.7
日付:

2020-11-06

  • [CHANGE] WebRTC 86.4240.10.0 に変更しました

  • [CHANGE] AudioMode.swift がターゲット含まれておらずビルドできなかった事象を修正しました

2020.6
日付:

2020-11-05

  • [CHANGE] WebRTC M86 に対応しました

  • [CHANGE] API: スポットライトに関する API について以下を変更しました

    • Configuration.spotlight: 非推奨になりました

    • Configuration.spotlightEnabled: 追加しました

    • Configuration.activeSpeakerLimit: 追加しました

  • [CHANGE] API: 音声モードに関する API について以下を変更しました

    • Sora.setAudioMode(_:options:): 追加しました

    • AudioMode: 追加しました

    • AudioOutput: 追加しました

  • [UPDATE] システム条件を更新しました

    • Xcode 12.0

    • Swift 5.3

    • CocoaPods 1.9.3

  • [FIX] API: Sora.connect(): タイムアウト時にハンドラが実行されない事象を修正しました

2020.5
日付:

2020-08-11

  • [UPDATE] システム条件を更新しました

    • Xcode 11.6

    • Swift 5.2.4

    • WebRTC SFU Sora 2020.1 以降

  • [UPDATE] WebRTC M84 に対応しました

  • [UPDATE] シグナリング pong に統計情報を追加しました

  • [FIX] API: 次のイベントハンドラのクラスにコンストラクタを追加しました

    • MediaChannelHandlers

    • MediaStreamHandlers

    • PeerChannelHandlers

    • SignalingChannelHandlers

    • SoraHandlers

    • VideoCapturerHandlers

    • WebSocketChannelHandlers

  • [FIX] API: Sora.connect(): 接続先ホストが存在しない場合にハンドラが実行されない事象を修正しました

2020.4.1
日付:

2020-04-08

  • [FIX] 受信したシグナリングの role が sendonly, recvonly, sendrecv の場合にデコードに失敗する事象を修正しました

  • [FIX] API: MediaChannel: senderStream: ストリーム ID が接続時に指定した配信用ストリームID と一致するストリームを返すように修正しました (変更前はカメラのストリームを返した)

  • [FIX] API: MediaChannel: receiverStreams: senderStream 以外のストリームを返すように修正しました (変更前はカメラ以外のストリームを返した)

2020.4
日付:

2021-03-27

  • [CHANGE] iOS 13 以降の場合に URLSession を使って WebSocket 通信を行うように修正しました

  • [CHANGE] Plan B に関連する API を削除しました

  • [CHANGE] シグナリングで送信する JSON にて、 role を upstream/downstream のどちらかで出力するように修正しました

  • [CHANGE] シグナリングの offer/update/ping を peer connection の状態に関わらず処理するように修正しました

  • [CHANGE] 端末情報を追加しました (iPhone 11, iPhone 11 Pro, iPhone1 11 Pro Max, iPad 7th)

  • [CHANGE] ログに出力される WebSocket のエラー内容を詳細にしました

  • [CHANGE] API: MediaChannel: senderStream プロパティを追加しました

  • [CHANGE] API: MediaChannel: receiverStreams プロパティを追加しました

2020.3
日付:

2020-02-28

  • [FIX] マイクが初期化されない事象を修正しました

2020.2
日付:

2020-02-25

  • [CHANGE] 受信時にマイクのパーミッションを要求しないようにしました

  • [FIX] Sora.remove(mediaChannel:) 実行時に onRemoveMediaChannel が呼ばれない事象を修正しました

2020.1
日付:

2020-01-20

本バージョンよりバージョン表記を「リリース年.リリース回数」に変更しました。

  • [CHANGE] WebRTC M79 に対応しました

  • [CHANGE] Carthage の使用を止めました

  • [CHANGE] シグナリングに含める各種バージョン情報を変更しました

  • [CHANGE] API: SocketRocket の使用を止めて Starscream を採用しました

  • [CHANGE] API: イベントハンドラのプロパティ名を短縮しました

  • [CHANGE] API: Configuration : init(url:channelId:role:) を非推奨にしました

  • [CHANGE] API: Configuration : init(url:channelId:role:multistreamEnabled:) を追加しました

  • [CHANGE] API: Configuration : webSocketChannelHandlers プロパティを追加しました

  • [CHANGE] API: Configuration : multistreamEnabled プロパティを追加しました

  • [CHANGE] API: Role : Sora の仕様に合わせて sendonly, recvonly, sendrecv を追加しました

  • [CHANGE] API: Role : publisher, subscriber, group, groupSub を非推奨にしました

  • [UPDATE] システム条件を更新しました

    • Xcode 11.3

    • CocoaPods 1.8.4 以降

    • WebRTC SFU Sora 19.10.3 以降

2.x
2.6.0
CHANGE
  • システム条件を更新しました

    • macOS 10.15

    • Xcode 11.1

  • WebRTC M78 に対応しました

2.5.0
CHANGE
  • システム条件を更新しました

    • Xcode 11

    • Swift 5.1

2.4.1
CHANGE
  • 依存するライブラリを変更しました (Cartfile)

    • sora-webrtc-ios 76.3.1 -> shiguredo-webrtc-ios 76.3.1

  • 対応アーキテクチャから armv7 を外しました

  • 対応アーキテクチャに x86_64 を追加しました (シミュレーターの動作は未保証です)

  • シグナリングに SDK と端末の情報を含めるようにしました

2.4.0
CHANGE
  • システム条件を更新しました

    • Xcode 10.3

  • WebRTC M76 に対応しました

  • サイマルキャスト機能に対応しました

  • スポットライト機能に対応しました

  • VAD 機能を削除しました

  • 音声ビットレートの指定に対応しました

  • シグナリングのメタデータに対応しました

  • API: Configuration: audioBitRate プロパティを追加しました

  • API: Configuration: maxNumberOfSpeakers プロパティを削除しました

  • API: Configuration: simulcastEnabled プロパティを追加しました

  • API: Configuration: simulcastQuality プロパティを追加しました

  • API: Configuration: spotlight プロパティを追加しました

  • API: SimulcastQuality: 追加しました

  • API: シグナリングに関する API の名前を変更しました

    • SignalingMessage -> Signaling

    • SignalingNotificationEventType -> SignalingNotifyEventType

    • SignalingConnectMessage -> SignalingConnect

    • SignalingOfferMessage -> SignalingOffer

    • SignalingOfferMessage.Configuration -> SignalingOffer.Configuration

    • SignalingPongMessage -> SignalingPong

    • SignalingPushMessage -> SignalingPush

  • API: SignalingAnswer: 追加しました

  • API: SignalingCandidate: 追加しました

  • API: SignalingClientMetadata: 追加しました

  • API: SignalingMetadata: 追加しました

  • API: SignalingNotifyConnection: 追加しました

  • API: SignalingNotifyNetworkStatus: 追加しました

  • API: SignalingNotifySpotlightChanged: 追加しました

  • API: SignalingOffer.Encoding: 追加しました

  • API: SignalingUpdate: 追加しました

  • API: Signaling: 追加しました

2.3.2
CHANGE
  • SDP セマンティクスのデフォルトを Unified Plan に変更しました

  • API: シグナリング "notify" の "connection_id" プロパティに対応しました

  • API: SDPSemantics: case default を削除しました

  • API: SignalingNotifyMessage: connectionId プロパティを追加しました

FIX
  • 接続状態によってシグナリング "notify" が無視される現象を修正しました

2.3.1
FIX
  • グループ (マルチストリーム) 時、映像を無効にした状態で接続すると落ちる現象を修正しました

2.3.0
CHANGE
  • システム条件を更新しました

    • WebRTC SFU Sora 19.04.0 以降

    • macOS 10.14.4 以降

    • Xcode 10.2

    • Swift 5

  • マルチストリーム時に強制的に Plan B に設定していたのを止めました

  • 未知のシグナリングメッセージを受信したら例外を発生するように変更しました

  • シグナリング "notify" の次のイベントに対応しました

    • "spotlight.changed"

    • "network.status"

2.2.1
CHANGE
  • システム条件を更新しました

    • WebRTC SFU Sora 18.10.0 以降

    • macOS 10.14 以降

    • iOS 10.0

    • Xcode 10.1

    • Swift 4.2.1

  • シグナリング "push" に対応しました

FIX
  • シグナリング "notify" に含まれるメタデータが解析されていない現象を修正しました

2.2.0
CHANGE
  • システム条件を更新しました

    • iOS 12.0

    • Xcode 10.0

    • Swift 4.2

  • API: ConnectionTask: 追加しました

  • API: Sora: connect(configuration:webRTCConfiguration:handler:): 実行中に接続の試行をキャンセル可能にしました

2.1.3
CHANGE
  • システム条件を更新しました

    • macOS 10.13.6 以降

    • Xcode 9.4

    • Swift 4.1

FIX
  • MediaChannel: 接続解除後、Sora にしばらく接続が残る可能性がある現象を修正しました

2.1.2
CHANGE
  • WebRTC SFU Sora 18.04 以降に対応しました

  • WebRTC M66 に対応しました

2.1.1
CHANGE
  • システム条件を更新しました

    • macOS 10.13.2 以降

    • Xcode 9.3

    • Swift 4.1

    • Carthage 0.29.0 以降、または CocoaPods 1.4.0 以降

    • WebRTC SFU Sora 18.02 以降

  • API: MediaStream: audioVolume プロパティを非推奨にしました

  • API: MediaStream: remoteAudioVolume プロパティを追加しました

FIX
  • API: MediaStream: 配信中に videoEnabled プロパティまたは audioEnabled プロパティで映像か音声を無効にすると、有効に戻しても他のクライアントに配信が再開されない現象を修正しました

  • API: WebRTCInfo: shortRevision: 戻り値の文字列が 7 桁でない現象を修正しました

2.1.0
CHANGE
  • 視聴のみのマルチストリームに対応しました

  • 音声検出による映像の動的切替に対応しました

  • API: Role: .groupSub を追加しました

  • API: Configuration: maxNumberOfSpeakers プロパティを追加しました

  • API: SignalingConnectMessage: maxNumberOfSpeakers プロパティを追加しました

2.0.4
CHANGE
  • WebRTC M64 に対応しました

2.0.3
CHANGE
  • WebRTC M63 に対応しました

  • SDWebImage 4.2.2 に対応しました

  • API: WebSocketChannelHandlers: onDisconnectHandler を追加しました

  • API: WebSocketChannelHandlers: onFailureHandler を削除しました

  • API: SignalingChannelHandlers: onDisconnectHandler を追加しました

  • API: SignalingChannelHandlers: onFailureHandler を削除しました

  • API: SoraError: WebSocket に関するエラーを次の二つに分割しました

    • webSocketClosed(statusCode:reason:)

    • webSocketError()

  • API: PeerChannelHandlers: onDisconnectHandler を追加しました

  • API: PeerChannelHandlers: onFailureHandler を削除しました

  • API: MediaChannelHandlers: onFailureHandler を削除しました

FIX
  • API: MediaChannel: PeerChannel の接続解除時に MediaChannel の状態が接続解除にならない現象を修正しました

2.0.2
CHANGE
  • connect シグナリングメッセージに Offer SDP を含めるようにしました

  • API: MediaStreamAudioVolume: 追加しました

  • API: MediaStream: audioVolume プロパティを追加しました

FIX
  • API: MediaStream: videoEnabled: 映像をオフにしても VideoView に反映されない現象を修正しました

  • API: MediaStream: audioEnabled: 音声の可否がサブスクライバーに反映されない現象を修正しました

2.0.1
CHANGE
  • Xcode 9.1 に対応しました

  • API: MediaStream: 接続中に映像と音声の送受信を停止・再開するプロパティを追加しました

  • API: MediaStreamHandlers: 追加しました

2.0.0

設計と API を大きく見直しました。

CHANGE
  • WebRTC M62 に対応しました

  • アーキテクチャ armv7 に対応しました

  • iOS 11 に対応しました

  • Xcode 9 に対応しました

  • Swift 4 に対応しました

  • 依存するフレームワークから Unbox.framework を削除しました

  • WebRTC のネイティブ API (主にクラスやプロトコル名の接頭辞が RTC の API) を非公開にしました

  • クライアントの設定を Configuration にまとめました

  • ロールについて、 "パブリッシャー (Publisher)" と "サブスクライバー (Subscriber)" に加えて、マルチストリームで通信を行う "グループ (Group)" を追加しました。

  • 通信を行うオブジェクト (WebSocket 接続、シグナリング接続、ピア接続、メディアストリーム) をプロトコルに変更しました (デフォルトの実装は private)

  • 内部で使用する WebSocket の API (SRWebSocket.framework の API) を非公開にしました

  • 任意の映像キャプチャーの使用を可能にしました

  • CMSampleBuffer を映像フレームとして使用可能にしました

  • 映像フレームの編集を可能にしました

CHANGE (API)
  • 次のクラス、構造体、列挙体、プロトコルを削除しました

    • Attendee: 同等の機能を MediaChannel に実装しました

    • BuildInfo: 同等の機能を WebRTCInfo に実装しました

    • Connection: パブリッシャーとサブスクライバーをそれぞれ独立させたため削除しました

    • ConnectionController: 同等の機能を削除しました

      • ConnectionController.Request

      • ConnectionController.Role

      • ConnectionController.StreamType

    • ConnectionError: 同等の機能を SoraError に実装しました

    • Event: 各イベントをイベントハンドラのみで扱うようにしました

      • Event.EventType

      • EventLog: ロギング機能を削除しました

    • MediaConnection: 同等の機能を MediaChannel に実装しました

    • MediaPublisher: パブリッシャーを MediaChannel で扱うようにしたため削除しました

    • MediaSubscriber: サブスクライバーを MediaChannel で扱うようにしたため削除しました

    • MediaOption: 同等の機能を Configuration に実装しました

    • Message: 同等の機能を SignalingMessage に実装しました

      • Message.MessageType

      • Messagable

    • PeerConnection: 同等の機能を PeerChannel に定義しました

    • PeerConnectionEventHandlers: 同等の機能を PeerChannelHandlers に実装しました

    • SignalingEventHandlers: 同等の機能を SignalingChannelHandlers に実装しました

    • SignalingNotify: 同等の機能を SignalingNotifyMessage に実装しました

    • SignalingSnapshot: 同等の機能を SignalingSnapshotMessage に実装しました

    • VideoFrameHandle: 同等の機能を VideoFrame に実装しました

    • WebSocketEventHandlers: 同等の機能を WebSocketChannelHandlers に実装しました

  • 次のクラスを追加しました

    • CameraVideoCapturer

    • CameraVideoCapturer.Settings

    • ICECandidate

    • ICEServerInfo

    • MediaChannel

    • MediaChannelHandlers

    • PeerChannelHandlers

    • SignalingChannelHandlers

    • Sora

    • SoraHandlers

    • VideoCapturerHandlers

    • WebSocketChannelHandlers

  • 次の構造体を追加しました

    • Configuration

    • MediaConstraints

    • SignalingConnectMessage

    • SignalingNotifyMessage

    • SignalingOfferMessage

    • SignalingOfferMessage.Configuration

    • SignalingPongMessage

    • SignalingSnapshotMessage

    • SignalingUpdateOfferMessage

    • Snapshot

    • WebRTCConfiuration

    • WebRTCInfo

  • 次の列挙体を追加しました

    • ConnectionState

    • ICETransportPolicy

    • LogLevel

    • NotificationEvent

    • SignalingNotificationEventType

    • SignalingMessage

    • SignalingRole

    • SoraError

    • TLSSecurityPolicy

    • VideoCapturerDecive

    • VideoFrame

    • WebSocketMessage

    • WebSocketMessageStatusCode

  • 次のプロトコルを追加しました

    • MediaStream

    • PeerChannel

    • SignalingChannel

    • VideoCapturer

    • ViderFilter

    • WebSocketChannel

  • Notification の使用を中止し、次の関連する構造体と列挙体を削除しました

    • Connection.NotificationKey

    • Connection.NotificationKey.UserInfo

    • MediaConnection.NotificationKey

    • MediaConnection.NotificationKey.UserInfo

    • MediaStream.NotificationKey

    • MediaStream.NotificationKey.UserInfo

  • AudioCodec について以下を変更しました

    • .Opus.opus に変更しました

    • .PCMU.pcmu に変更しました

  • MediaStream について以下を変更しました

    • クラスからプロトコルに変更し、 API を一新しました

  • Role について以下を変更しました

    • .group を追加しました

  • VideoCodec について以下を変更しました

    • .VP8.vp8 に変更しました

    • .VP9.vp9 に変更しました

    • .H264.h264 に変更しました

  • VideoFrame について以下を変更しました

    • プロトコルから列挙体に変更し、 API を一新しました

  • VideoRenderer について以下を変更しました

    • onChangedSize(_:)onChange(size:) に変更しました

    • renderVideoFrame(_:)render(videoFrame:) に変更しました

1.x
1.2.5
FIX
  • CircleCI でのビルドエラーを修正しました

1.2.4
CHANGE
  • armv7 に対応しました

  • API: MediaOption を struct に変更しました

  • API: ConnectionController: ロールとストリーム種別の選択制限を削除しました

FIX
  • API: マルチストリーム時、配信者のストリームが二重に生成されてしまう現象を修正しました

1.2.3
日付:

2017-8-29

対応 Sora:

17.06

CHANGE
  • API: VideoView: contentMode に応じて映像のサイズを変更するようにしました

FIX
  • API: 残っていたデバッグプリントを削除しました

1.2.2
日付:

2017-8-16

対応 Sora:

17.06

CHANGE
  • API: 一部の静的変数を定数に変更しました

FIX
  • API: VideoView: メモリー解放時に Key-Value Observing に関する例外が発生する現象を修正しました

  • API: VideoView: メモリー解放時にクラッシュする現象を修正しました

1.2.1
日付:

2017-8-3

対応 Sora:

17.06

FIX
  • API: ConnectionController: 指定した映像・音声コーデックが UI とシグナリングに反映さ>れない現象を修正しました

1.2.0
日付:

2017-8-2

対応 Sora:

17.06

CHANGE
  • WebRTC M60 に対応しました

  • Bitcode に対応しました

  • スナップショットに対応しました

  • リンクするフレームワークに SDWebImage.framework を追加しました

  • API: Event.EventType: 次のケースを追加しました

    • case Snapshot

  • API: MediaOption: 次のプロパティを追加しました

    • var snapshotEnabled

  • API: SignalingEventHandlers: 次のメソッドを追加しました - func onSnapshot(handler: (SignalingSnapshot) -> Void)

  • API: SignalingSnapshot: 追加しました

  • API: Snapshot: 追加しました

  • API: VideoFrame について以下を変更しました

    • var width: Int32 -> Int

    • var height: Int32 -> Int

    • var timestamp: CMTime -> CMTime?

  • API: VideoFrameHandle: 次のプロパティ名を変更しました

    • case webRTC -> case WebRTC

  • API: VideoFrameHandle: 次のプロパティを追加しました

    • case snapshot

  • API: VideoView: スナップショットの描画に対応しました

  • API: ConnectionController: スナップショットの項目を追加しました

1.1.0
日付:

2017-7-7

対応 Sora:

17.06

CHANGE
  • CircleCI を利用した自動ビルドを追加しました

  • examples を削除しました

  • WebRTC M59 に対応しました

  • ディレクトリ構造を変更し、プロジェクトのファイルをトップレベルに移動しました

  • シグナリング "notify" に対応しました

  • イベントログに接続エラーの詳細を出力するようにしました

  • 次の不要なファイルを削除しました

    • JSON.swift

  • API: Attendee: 追加しました

  • API: BuildInfo: 次のプロパティを削除しました

    • var VP9Enabled

  • API: Connection: 次のプロパティとメソッドを削除しました

    • var numberOfConnections

    • func onChangeNumberOfConnections(handler:)

  • API: ConnectionError: var description を追加しました

  • API: ConnectionController: ビットレートの設定項目を追加しました

  • API: ConnectionController: イベントログの画面を追加しました

  • API: ConnectionController: Cancel ボタンを Back ボタンに変更しました

  • API: Event.EventType: ConnectionMonitor を追加しました

  • API: MediaConnection: 次のプロパティとメソッドを追加しました

    • var numberOfConnections

    • func onAttendeeAdded(handler:)

    • func onAttendeeRemoved(handler:)

    • func onChangeNumberOfConnections(handler:)

  • API: MediaStreamRole: 削除しました

  • API: Role: 追加しました

  • API: PeerConnection: 接続状態に関わらず WebSocket のイベントハンドラを実行するようにしました

  • API: SignalingEventHandlers: func onNotify(handler:) を追加しました

  • API: SignalingEventType: 追加しました

  • API: SignalingNotify: 追加しました

  • API: SignalingRole: 追加しました

  • API: VideoFrame について以下を変更しました

    • var width: Int -> Int32

    • var height: Int -> Int32

  • API: ConnectionController: リファクタリングを行いました

  • API: ConnectionController: VP9 の有効・無効を示すセルを削除しました

FIX
  • Sora の URL のプロトコルが ws または wss 以外であればエラーにするよう変更しました

  • 接続解除可能な状況でも connectionBusy のエラーが発生する現象を修正しました

  • 接続解除後も内部で接続状態の監視を続ける現象を修正しました

  • API: ConnectionController: 接続画面外で接続が解除されても接続画面では接続状態である現象を修正しました

  • API: VideoView のサイズの変化に動画のサイズが追従しない現象を修正しました

1.0.1
日付:

2017-06-05

対応 Sora:

17.04

  • [CHANGE] システム条件を更新しました

    • Xcode 8.1 以降 -> 8.3.2 以降

    • Swift 3.0.1 -> 3.1

  • [UPDATE] SoraApp の Cartfile で利用する shiguredo/sora-ios-sdk を 1.0.1 にアップデートしました

1.0.0
日付:

2017-04-10

対応 Sora:

17.02

  • [CHANGE] WebRTC M57 に対応しました

  • [CHANGE] 対応アーキテクチャを arm64 のみにしました

  • [CHANGE] マルチストリームに対応しました

  • [CHANGE] シグナリング: "notify" に対応しました

  • [CHANGE] シグナリング: Sora の仕様変更に伴い、 "stats" への対応を廃止しました

  • [CHANGE] シグナリング: Sora の仕様変更に伴い、 "connect" の "access_token" パラメーターを "metadata" に変更しました

  • [CHANGE] API: ArchiveFinished: 削除しました

  • [CHANGE] API: ArchiveFailed: 削除しました

  • [CHANGE] API: MediaConnection: MediaStream を複数保持するようにしました

  • [CHANGE] API: MediaConnection: multistreamEnabled プロパティを追加しました

  • [CHANGE] API: MediaConnection: 次の変数の型を変更しました

    • webSocketEventHandlers: WebSocketEventHandlers? --> WebSocketEventHandlers

    • signalingEventHandlers: SignalingEventHandlers? --> SignalingEventHandlers

    • peerConnectionEventHandlers: PeerConnectionEventHandlers? --> PeerConnectionEventHandlers

  • [CHANGE] API: MediaConnection: connect(accessToken:timeout:handler:) メソッドの型を connect(metadata:timeout:handler:) に変更しました

  • [CHANGE] API: MediaConnection, MediaStream: 次の API を MediaStream に移行しました

    • var videoRenderer

    • func startConnectionTimer(timeInterval:handler:)

  • [CHANGE] API: MediaConnection.State: 削除しました

  • [CHANGE] API: MediaOption.AudioCodec: unspecifieddefault に変更しました

  • [CHANGE] API: MediaOption.VideoCodec: unspecifieddefault に変更しました

  • [CHANGE] API: MediaPublisher: autofocusEnabled プロパティを追加しました

  • [CHANGE] API: MediaStream: RTCPeerConnection のラッパーではなく、 RTCMediaStream のラッパーに変更しました

  • [CHANGE] API: MediaStream: startConnectionTimer(timeInterval:handler:): タイマーを起動した瞬間もハンドラーを実行するようにしました

  • [CHANGE] API: MediaStream.State: 削除しました

  • [CHANGE] API: PeerConnection: RTCPeerConnection のラッパーとして追加しました

  • [CHANGE] API: SignalingConnected: 削除しました

  • [CHANGE] API: SignalingCompleted: 削除しました

  • [CHANGE] API: SignalingDisconnected: 削除しました

  • [CHANGE] API: SignalingFailed: 削除しました

  • [CHANGE] API: StatisticsReport: RTCStatsReport の変更 (名前が RTCLegacyStatsReport に変更された) に伴い削除しました

  • [CHANGE] API: VideoView: 映像のアスペクト比を保持するようにしました

  • [UPDATE] API: MediaCapturer: 同一の RTCPeerConnectionFactory で再利用するようにしました

  • [UPDATE] API: MediaCapturer: 映像トラック名と音声トラック名を自動生成するようにしました

  • [UPDATE] API: VideoRenderer: 描画処理をメインスレッドで実行するようにしました

  • [UPDATE] API: VideoView: UI の設計に Nib ファイルを利用するようにしました

  • [UPDATE] API: VideoView: バックグラウンド (ビューがキーウィンドウに表示されていない) では描画処理を中止するようにしました

  • [ADD] API: BuildInfo: 追加しました

  • [ADD] API: ConnectionController: 追加しました

  • [ADD] API: Connection: 次の API を追加しました

    • var numberOfConnections

    • func onChangeNumberOfConnections(handler:)

  • [ADD] API: Connection, MediaConnection, MediaStream, PeerConnection: 次のイベントで (NotificationCenter による) 通知を行うようにしました

    • onConnect

    • onDisconnect

    • onFailure

  • [ADD] API: WebSocketEventHandlers, SignalingEventHandlers, PeerConnectionEventHandlers: イニシャライザーを追加しました

  • [FIX] シグナリング: 音声コーデック Opus を指定するためのパラメーターの間違いを修正しました

  • [FIX] 接続解除後にイベントログを記録しようとして落ちる現象を修正しました

  • [FIX] 接続失敗時にデバイスを初期化しようとして落ちる現象を修正しました (接続成功時のみ初期化するようにしました)

  • [FIX] 接続試行中にエラーが発生して失敗したにも関わらず、成功と判断されてしまう場合がある現象を修正しました

  • [FIX] API: MediaConnection: 接続解除後もタイマーが実行されてしまう場合がある現象を修正しました (タイマーに関する API は MediaStream に移動しました)

  • [FIX] API: PeerConnection: 接続失敗時でもタイムアウト時のイベントハンドラが呼ばれる現象を修正しました

0.x
0.1.0
日付:

2016-12-28

対応 Sora:

3.4

過去の移行ドキュメント

2022.4.0 で実施するスポットライト機能に対する破壊的変更について
概要

2022 年 6 月の Sora リリースからサイマルキャスト機能が無効の状態でスポットライト機能を利用できるようになりました。 この変更に伴い、 Sora iOS SDK では 2022.4.0 にてスポットライト機能利用時にサイマルキャストを自動的に有効にする機能を廃止します。

変更内容

変更前はスポットライト機能を有効化した際に、自動的にサイマルキャスト機能を有効化していたため、映像送信時に複数画質の映像を送信する動作となっていました。

変更後は自動的にサイマルキャスト機能を有効化しませんので、複数画質の映像を送信したい場合は明示的にサイマルキャストを有効化する必要があります。

修正が必要なケース

2022.4.0 以前に Sora iOS SDK のスポットライト機能を利用している場合、処理の修正が必要になります。

修正例

引き続きサイマルキャスト機能を有効にしてスポットライト機能を利用したい場合は Configuration.simulcastEnabled プロパティに true の設定を追加してください。

変更前
let config = Configuration(url: soraURL,
                           channelId: soraChannelId,
                           role: role,
                           multistreamEnabled: true)

// スポットライト機能を有効にします。
config.spotlightEnabled = .enabled
変更後
let config = Configuration(url: soraURL,
                           channelId: soraChannelId,
                           role: role,
                           multistreamEnabled: true)

// スポットライト機能を有効にします。
config.spotlightEnabled = .enabled

// サイマルキャスト機能を有効化する設定を追加します。
config.simulcastEnabled = true
© Copyright 2018-2024, Shiguredo Inc. Created using Sphinx 8.2.1