Sora iOS SDK ドキュメント¶
このドキュメントは Sora iOS SDK バージョン 2025.1.1 に対応しています。
Sora 自体の製品お問い合わせは sora at shiguredo dot jp までお願い致します。 (このメールアドレスへの特定電子メールの送信を拒否いたします)
問い合わせについて¶
Sora iOS SDK の質問などについては Discord の #sora-sdk-faq
をご利用ください。
ただし、 Sora のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。
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 のライセンス契約の有無に関わらず、応答時間と問題の解決を保証しませんのでご了承ください。
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 時にリスト形式の転送フィルターを設定するための項目を追加しました
Configuration
とSignalingConnect
にforwardingFilters
を追加しました
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] SignalingOffer に
simulcast: 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
が廃止されたのに伴い、SignalingNotify
のmetadataList
を削除しました代わりに
SignalingNotify
のdata
で値を取得できます
[CHANGE] VideoView のバックエンドを RTCEAGLVideoView から RTCMTLVideoView に変更しました
libwebrtc のアップデートに伴い
RTCEAGLVideoView
がdeprecated
になったことに伴う修正です
[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 で対応した
ForwardingFilter
のversion
とmetadata
を追加しました[ADD]
VideoCodec
にハードウェアアクセラレーターを利用した HEVC(H.265) の映像を送受信できるようにするコーデック指定H265
を追加しました[ADD] リソースの逼迫により、送信する映像の品質が維持できない場合に、解像度やフレームレートのどちらを維持するかを指定できる設定
degradationPreference
をWebRTCConfiguration
に追加しました詳細については CPU やネットワーク帯域等逼迫時における映像品質優先項目の設定 をご確認ください
[FIX]
ForwardingFilter
のaction
を未指定にできるように修正しました[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)
アトリビュートの項目を削除しましたSwift 5.9 以降
@available(*, unavailable)
アトリビュートが禁止されたことによる対応です削除した項目を利用していた場合ビルドエラーが発生するため 2023.3.0 で実施する利用不可項目の削除について を参照して対応をお願いします
[CHANGE]
@available(*, deprecated, ... )
としていた非推奨項目を削除する非推奨であった項目について削除に移行しました
削除した項目を利用していた場合ビルドエラーが発生するため 2023.3.0 で実施する利用不可項目の削除について を参照して対応をお願いします
[CHANGE]
PeerChannel.swift
とSignalingChannel.swift
のonConnectHandler
をonConnect
に置き換えました既に他のファイルでは名称変更を行なっていたがこのファイルのみ変更が行われていなかったため対応する
[UPDATE] WebRTC 116.5845.6.1 に対応しました
[FIX]
MediaChannel
のconnectionCount
,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] 接続時に転送フィルターを指定できるようにしました
Configuration
にforwardingFilter
を追加しました詳細は 転送フィルターの設定 をご確認ください
[ADD] 接続時に映像コーデックパラメーターを指定できるようにしました
Configuration
にvideoVp9Params
,videoAv1Params
,videoH264Params
を追加しました詳細は 映像コーデックパラメーターの設定 をご確認ください
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]
CameraSettings
のResolution
にuhd2160p
,uhd3024p
を追加しました[ADD]
Configuration
にaudioStreamingLanguageCode
を追加しました[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
チャンネルにお願いします。
ただし、 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 で利用した場合はビルドエラーが発生する項目です。 移行が未完了の場合は、以下を参考に移行をお願いします。
Configration
のurl
シグナリング URL の複数指定が可能となったため廃止となりました。
urlCandidates
で代替してください。
Configration
のsignalingChannelHandlers
廃止となりました。利用できません。
mediaChannelHandlers
で代替してください。
Configration
のPeerChannelHandlers
廃止となりました。利用できません。
mediaChannelHandlers
で代替してください。
Configration
のsignalingChannelType
廃止となりました。利用できません。
Configration
のwebSocketChannelType
廃止となりました。利用できません。
Configration
のpeerChannelType
廃止となりました。利用できません。
Configration
のallowsURLSessionWebSocketChannel
廃止となりました。利用できません。
Configration
のvideoCapturerDevice
廃止となりました。利用できません。
カメラの設定については
Configration
のcameraSettings
にて指定できます。カスタムキャプチャーについては
MediaStream.send(videoFrame:)
を利用して映像フレームを送信してください。カメラの操作 も参考にしてください。
MediaChannelHandlers
のwebSocketChannel
廃止となりました。利用できません。
WebSocketChannelHandlers
のonMessageHandler
onReceive
に置き換えられました。
WebSocketChannelHandlers
のonDisconnectHandler
廃止となりました。利用できません。
WebSocketChannelHandlers
のonPongHandler
廃止となりました。利用できません。
WebSocketChannelHandlers
のonSendHandler
廃止となりました。利用できません。
WebSocketChannelHandlers
のonDisconnect
廃止となりました。利用できません。
WebSocketChannelHandlers
のonPong
廃止となりました。利用できません。
WebSocketChannelHandlers
のonSend
廃止となりました。利用できません。
WebSocketChannel
廃止となりました。利用できません。
VideoCapturerDevice
廃止となりました。利用できません。
VideoCapturer
廃止となりました。利用できません。
カスタムキャプチャーについては
MediaStream.send(videoFrame:)
を利用して映像フレームを送信してください。
VideoCapturerHandlers
廃止となりました。利用できません。
カスタムキャプチャーについては
MediaStream.send(videoFrame:)
を利用して映像フレームを送信してください。
CameraVideoCapturer
のshared
廃止となりました。利用できません。
起動中の
CameraVideoCapturer
はCameraVideoCapturer.current!
で取得できます。
CameraVideoCapturer
のsettings
廃止となりました。利用できません。
CameraSettings
に定義を行うように変更しています。
CameraVideoCapturer
のcaptureDevices
CameraVideoCapturer
のdevices
を利用して取得をおこなってください。
CameraVideoCapturer
のcaptureDevice(for position: AVCaptureDevice.Position)
CameraVideoCapturer
のdevice(for position: AVCaptureDevice.Position)
を利用して取得をおこなってください。
CameraVideoCapturer
のsuitableFormat(for device: AVCaptureDevice, resolution: Any)
廃止となりました。利用できません。
CameraVideoCapturer
のformat(width: Int32, height: Int32, for device: AVCaptureDevica, frameRate: Int?)
で代替してください。
CameraVideoCapturer
のsuitableFrameRate(for format: AVCaptureDevice.Format, frameRate: Int)
廃止となりました。利用できません。
CameraVideoCapturer
のmaxFrameRate(_ frameRate: Int, for format: AVCaptureDevice.Format)
で代替してください。
CameraVideoCapturer
のcanStop
廃止となりました。利用できません。
Sora との切断時にカメラは自動的に停止されます。
CameraVideoCapturer
のstopWhenDone
廃止となりました。利用できません。
Sora との切断時にカメラは自動的に停止されます。
CameraVideoCapturer
のstopWhenDone
廃止となりました。利用できません。
Sora との切断時にカメラは自動的に停止されます。
SignalingMetadata
廃止となりました。利用できません。
メタデータは Any? を任意の型にキャストして利用してください。
SignalingClientMetadata
廃止となりました。利用できません。
SignalingNotifyMetadata
で代替してください。
SignalingNotifyEventType
廃止となりました。利用できません。
SignalingNotifyConnection
廃止となりました。利用できません。
この Struct の定義は
SignalingNotify
に集約されています。
SignalingNotifySpotlightChanged
廃止となりました。利用できません。
この Struct の定義は
SignalingNotify
に集約されています。
SignalingNotifyNetworkStatus
廃止となりました。利用できません。
この Struct の定義は
SignalingNotify
に集約されています。
DeviceInfo
のmodel
廃止となりました。利用できません。
@available(*, deprecated, ... ) が指定されている項目¶
Sora iOS SDK 2023.2.0 までは警告のみで内部的に移行先に値を設定しておりビルドエラーは発生しませんでした。項目自体を削除したため、以下を参考に移行をお願いします。 移行が未完了の場合は、以下を参考に移行をお願いします。
Role
のpublisher
廃止となりました。利用できません。
sendonly
で代替してください。
Role
のsubscriber
廃止となりました。利用できません。
recvonly
で代替してください。
Role
のgroup
廃止となりました。利用できません。
sendrecv
で代替してください。
Role
のgroupSub
廃止となりました。利用できません。
recvonly
で代替してください。
Configration
のinit
初期化時にマルチストリームの指定が必須となりました。
Configuration(url: url, channelId: soraChannelId, role: .recvonly, multistreamEnabled: false)
のように指定してください。
Configration
のspotlight
spotlightNumber
に置き換えられました。
Configration
のactiveSpeakerLimit
spotlightNumber
に置き換えられました。
SignalingConnect
のspotlight
spotlightNumber
に置き換えられました。
SignalingConnect
のactiveSpeakerLimit
spotlightNumber
に置き換えられました。
SignalingNotify
のpublisherCount
廃止となりました。利用できません。
channelSendonlyConnections
とchannelSendrecvConnections
の合計値で代替してください。
SignalingNotify
のsubscriberCount
廃止となりました。利用できません。
channelRecvonlyConnections
とchannelSendrecvConnections
の合計値で代替してください。
SoraHandlers
のonConnectHandler
onConnect
に置き換えられました。
SoraHandlers
のonDisconnectHandler
onDisconnect
に置き換えられました。
SoraHandlers
のonAddMediaChannelHandler
onAddMediaChannel
に置き換えられました。
SoraHandlers
のonRemoveMediaChannelHandler
onRemoveMediaChannel
に置き換えられました。
MediaChannelHandlers
のonConnectHandler
onConnect
に置き換えられました。
MediaChannelHandlers
のonDisconnectHandler
onDisconnect
に置き換えられました。
MediaChannelHandlers
のonAddStream
onRemoveStreamHandler
に置き換えられました。
MediaChannelHandlers
のonDisconnectHandler
onRemoveStream
に置き換えられました。
MediaChannelHandlers
のonReceiveSignalingHandler
onReceiveSignaling
に置き換えられました。
MediaStreamHandlers
のonSwitchVideoHandler
onSwitchVideo
に置き換えられました。
MediaStreamHandlers
のonSwitchAudioHandler
onSwitchAudio
に置き換えられました。
CameraPosition
起動時のカメラ設定は
Configuration.cameraSettings.position
の.front
または.back
を設定します。起動後のカメラの切り替えは
CameraVideoCapturer
のflip(_:completionHandler:)
を使用します。カメラの操作 も参考にしてください。
CameraVideoCapturer
のcurrentCameraDevice
CameraVideoCapturer
のdevice
を利用して取得をおこなってください。
セットアップ¶
システム条件¶
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 リポジトリをローカルの環境に登録してください。
Spec リポジトリをローカルの Spec リポジトリに登録します。
$ pod repo add sora-ios-sdk-specs https://github.com/shiguredo/sora-ios-sdk-specs.git
Spec のリストを更新します。
$ pod repo update
以上の操作が必要になるのは初回のみです。 プロジェクト生成のたびに実行する必要はありません。
Podfile を用意する¶
先頭に次の記述を追加します。 Sora iOS SDK の Spec リポジトリから検索するようにします。
source 'https://cdn.cocoapods.org/' source 'https://github.com/shiguredo/sora-ios-sdk-specs.git'
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
pod install
を実行してライブラリをインストールします。
Swift Package Manager を利用する¶
パッケージを追加する¶
Xcodeのメニューから[File]-[Add Packages...] を選択します
検索ボックスに https://github.com/shiguredo/sora-ios-sdk を入力します

利用するSDK のバージョンを選択して [Add Package]を選択します

Sora, WebRTC の両方を選択して [Add Package]を選択します

カメラとマイクを許可する¶
ナビゲーターエリアからプロジェクトエディターの Info タブを開き Custom iOS Target Properties にカメラとマイクの用途を記述します。 この記述を追加しないとアプリケーションが強制終了するので、必ず記述してください。
※ Xcode13 以前からのプロジェクトを利用する場合は、Info.plist ファイルに以下の記述を追加してください。
カメラの用途: "Privacy - Camera Usage Description"
マイクの用途: "Privacy - Microphone Usage Description"
設定例:

クイックスタート¶
この章では、 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") 。
ビルド対象アーキテクチャの選択:

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
プロパティにセットします。端末のカメラとマイクはパブリッシャーの接続時に初期化されて使用可能になります。
その他のサンプルコード¶
下記のリポジトリでその他の様々なサンプルコードを公開しています。
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 への接続は次の手順で行います。
Configuration を生成する。
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 経由のシグナリングを有効にするには、 Configuration の dataChannelSignaling
プロパティに 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 接続時に送信する音声についてコーデックの指定ができます。
音声のコーデックは Configuration の
audioCodec
に AudioCodec を設定します。
var config = Configuration(url: url,
channelId: channelId,
role: .sendrecv,
multistreamEnabled: true)
// 音声コーデックを opus に設定する
config.audioCodec = .opus
音声ビットレートの設定¶
Sora 接続時に送信する音声についてビットレートの指定ができます。
音声のビットレートは Configuration の
audioBitRate
に設定します。
var config = Configuration(url: url,
channelId: channelId,
role: .sendrecv,
multistreamEnabled: true)
// 音声ビットレートを 32 kbps に設定する
config.audioBitRate = 32
映像コーデックの設定¶
Sora 接続時に送信する映像についてコーデックの指定ができます。
映像のコーデックは Configuration の
videoCodec
に VideoCodec を設定します。利用できる映像コーデックは VP8 / VP9 / H.264 / H.265 / AV1 です。未指定の場合は Sora のデフォルト値が設定されます。
var config = Configuration(url: url,
channelId: channelId,
role: .sendrecv,
multistreamEnabled: true)
// 映像コーデックを VP8 に設定する
config.videoCodec = .vp8
映像ビットレートの設定¶
Sora 接続時に送信する映像についてビットレートの指定ができます。
映像のビットレートは Configuration の
videoBitRate
に設定します。
var config = Configuration(url: url,
channelId: channelId,
role: .sendrecv,
multistreamEnabled: true)
// ビデオビットレートを 3000 kbps に設定する
config.videoBitRate = 3000
映像コーデックパラメーターの設定¶
送信する映像コーデックの設定と合わせて、映像コーデックのパラメータを指定可能です。
この機能は role
が sendrecv
または 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 ドキュメント を参照してください。
この機能は role
が sendrecv
または 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]
プロキシ・サーバーの設定¶
プロキシ・サーバーを 経由した通信を行う場合は、 Configuration の proxy
プロパティにプロキシ情報をセットしてください。
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 やネットワーク帯域などの制約を受けて、指定された解像度やフレームレートを維持できないことがあります。 そのような場合に、優先する項目を設定することができます。
例えば、文章が中心のスライドを利用するプレゼンテーションなど、フレームレートより解像度を優先した映像の配信を行いたい場合に、解像度を優先するように設定できます。
設定は Configuration の webRTCConfiguration.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 のみです。
metadata
と notifyMetadata
のメタデータを指定できます。
メタデータは 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
によって管理されます。
AVCaptureSession
は captureSession
プロパティで取得できます。
映像の流れ¶
キャプチャーが取得した映像は、映像フレームに変換されて 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
プロパティ)
配信開始時にカメラを停止しておき、あとから任意のタイミングで起動する場合は isEnabled
に false
を指定します。
手動でカメラを起動する手順を次に示します:
起動したいカメラに対応する
AVCaptureDevice
を取得します。使用するフォーマットを決めます。 使用可能なフォーマットは
format(width:height:for:frameRate:)
で取得できます。使用するフレームレートを決めます。 2. で取得したフォーマットと希望するフレームレートを
maxFrameRate(_:for:)
の引数に与えて実行すると、 その値を上限とする使用可能なフレームレートを取得できます。 もし 60fps を指定しても、フォーマットが対応する上限が 30fps であれば 30fps を返すので注意してください。start(format:frameRate:completionHandler:)
) を実行してカメラを起動します。 起動処理の終了後、起動の成否に関わらずcompletionHandler:
が実行されます。
カメラを停止・再起動する¶
映像の配信が終了すると、起動中のカメラも自動的に停止します。
(映像を配信しない場合でも CameraSettings.isEnabled
が true
であれば停止します) 。
起動中のカメラを一時的に停止するには 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
をウィンドウに配置する場合は、次の手順で設定します。
ウィンドウに UIView を配置する
インスペクタを開き、 "Custom Class" の次の設定を変更する
"Class": "VideoView" を指定する
"Module": "Sora" を指定する
![]()
独自の映像レンダラーを実装する¶
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 は、カメラの起動時に UIDevice
の beginGeneratingDeviceOrientationNotifications()
を、停止時に 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
指定は任意です。デフォルトで
allowBluetooth
、allowBluetoothA2DP
、allowAirPlay
が設定されています。指定した場合はデフォルトの音声カテゴリオプションは設定されず、指定した音声カテゴリオプションのみが設定されます。
AudioMode の指定方法および AVAudioSession のプロパティ設定内容¶
AudioMode はモード毎にそれぞれ異なる引数を取ります。 指定する引数の内容と、指定された引数によって設定される AVAudioSession のプロパティの値は以下のとおりです。
default(category: AVAudioSession.Category, output: AudioOutput)
音声モードに
default
を設定します音声カテゴリに引数で指定された category を設定します
output には AudioOutput の
default
またはspeaker
を指定しますoutput に
speaker
が指定されていた時、音声カテゴリオプションにdefaultToSpeaker
が追加で設定されます
videoChat
音声モードに
videoChat
が設定されます音声カテゴリに
playAndRecord
が設定されます
voiceChat(output: AudioOutput)
音声モードに
voiceChat
を設定します音声カテゴリに
playAndRecord
を設定しますoutput には AudioOutput の
default
または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 の onReceiveSignaling
と onDataChannelMessage
を利用して以下のように処理します。
Configuration.mediaChannelHandlers.onReceiveSignaling でヘッダーの長さ(バイト数)を取得する
Configuration.mediaChannelHandlers.onDataChannelMessage で受けとったメッセージを先頭からヘッダーの長さ分とそれ以降に分割する
// 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 種類あります。
メディアチャネル ( MediaChannel ) のプロパティから取得する
Sora への接続後、 MediaChannel の以下のプロパティより接続中の MediaStream の取得が行えます
streams: 全てのメディアストリームのリスト
senderStream: 送信されるメディアストリーム
receiverStreams: 受信したメディアストリームのリスト
mainStream: 先頭のメディアストリーム
単一映像を受信のみするケース、単一映像を送信のみするケースでの利用を想定しています
メディアチャネル ( MediaChannel ) のイベントハンドラから取得する
Sora への接続後、 MediaChannel のイベントハンドラである MediaChannelHandlers より追加、または削除された MediaStream の取得が行えます
onAddStream: 追加されたメディアストリーム
onRemoveStream: 削除されたメディアストリーム
映像ビュー¶
映像ビュー (VideoView
) はメディアストリームの音声と映像を描画するビューオブジェクトです。いずれのロールの映像も描画できます。
SDK のログをコンソールに出力する¶
Logger
の level
プロパティでログレベルの指定が可能です。
デフォルトのログレベルは .info
です。
例: デバッグログを出力する
Logger.shared.level = .debug
WebRTC¶
WebRTC ライブラリのバージョンを知りたい¶
WebRTCInfo
の version
プロパティで Sora iOS SDK が使用する WebRTC のバージョンを取得できます。
メジャーバージョンがリリースブランチを表します。
WebRTC ライブラリの API を使う¶
WebRTC ライブラリの API (接頭辞が RTC
のもの) を使うには、 WebRTC
フレームワークをインポートする必要があります。
ファイルの先頭に import WebRTC
を記述してください。
WebRTC ライブラリのログをコンソールに出力する¶
WebRTC の挙動について Sora iOS SDK より詳細なログを出力したい場合は、 Sora
オブジェクトの setWebRTCLogLevel()
を使ってログレベルを指定します。
// 最も詳細なログを表示する
Sora.setWebRTCLogLevel(.verbose)
メディア制約を指定する¶
メディア制約は MediaConstraints
で表されます。
MediaConstraints
を WebRTCConfiguration
の constraints
プロパティにセットすることでメディア制約を指定可能です。
ICE サーバーの URL を指定する¶
ICE サーバーの情報は ICEServerInfo
で表されます。
サーバーの URL をセットした ICEServerInfo
を WebRTCConfiguration
の iceServerInfos
プロパティに指定します。
シグナリング¶
メタデータを指定する¶
任意の JSON 値の送受信 を参照してください。
送受信されたシグナリングの内容を確認する¶
シグナリングの内容はデバッグログを有効にするとコンソールに出力されます。 設定方法は SDK のログをコンソールに出力する を参照してください。
接続¶
Sora に接続する¶
大まかな手順を次に示します。 Sora に接続する も参考にしてください。
Configuration
を生成します。Sora のシグナリング URL 、チャネル ID 、ロールをセットします。Sora
オブジェクトのconnect(configuration:webRTCConfiguration:handler:)
を実行します。実行後はhandler:
に渡したブロックが実行されます。接続が成功するとストリームが生成されます。このストリームは
mainStream
プロパティでアクセスできます。
マルチストリーム機能を有効にして接続する¶
詳しくは マルチストリーム機能 を参照してください。
接続試行時のタイムアウトを設定する¶
接続試行時のタイムアウトまでの秒数は、 Configuration
の connectionTimeout
プロパティで指定可能です。
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
)
配信ストリームを取得する¶
配信ストリーム (端末のカメラとマイクのメディアデータを送信するストリーム) は MediaChannel
の senderStream
プロパティで取得できます。
受信ストリームのリストを取得する¶
受信ストリームのリストは MediaChannel の receiverStreams
プロパティで取得できます。
受信ストリームに紐づく Sora のコネクション ID を取得する¶
MediaStream の streamId
プロパティにはストリームを送信したクライアントのコネクション ID が設定されています。
受信した MediaStream は MediaChannel の receiverStreams
プロパティや、 MediaChannel のイベントハンドラである MediaChannelHandlers から取得できます。
映像と音声¶
映像と音声の可否を指定する¶
映像なら Configuration
の videoEnabled
プロパティ、音声なら audioEnable
プロパティで指定可能です。
映像・音声コーデックを指定する¶
映像コーデックなら Configuration
の videoCodec
プロパティ、音声コーデックなら audioCodec
プロパティで指定可能です。
映像ビットレートを指定する¶
Configuration
の videoBitRate
プロパティで指定可能です。
送受信された映像を描画する¶
映像は 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" を指定します。

音声をミュートする、音量を変更する¶
音声の操作 を参照してください。
映像と音声の送受信を一時的に停止する¶
接続中に映像または音声の送受信を一時的に停止・再開するには、 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 ライブラリを試してみてください。 Configuration
の allowsURLSessionWebSocketChannel
プロパティを 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
の際に、自動的にサイマルキャストを有効化しない変更を行いましたサイマルキャストを有効化する場合は明示的に
Configuration.simulcastEnabled == true
を設定してください詳細は 2022.4.0 で実施するスポットライト機能に対する破壊的変更について をご確認ください。
[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 の指定に対応しました
Configuration.url
を廃止してConfiguration.urlCandidates
を追加しましたMediaChannel.connectedUrl
を追加しました詳細は 複数のシグナリング 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
に遷移した際の切断処理中にクラッシュする問題を修正しましたBasicPeerChannelContext
とPeerChannel
の循環参照を防ぐために弱参照を利用していましたが、それが原因で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.Settings
をCameraSettings
にリネームしましたVideoCapturerHandlers
をCameraVideoCapturerHandlers
にリネームしました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
修正にともない
SignalingClientMetadata
をSignalingNotifyMetadata
にリネームしました
[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:
unspecified
をdefault
に変更しました[CHANGE] API: MediaOption.VideoCodec:
unspecified
をdefault
に変更しました[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