From fcb0a31b32e3687567e363f1a3dd76aae4267148 Mon Sep 17 00:00:00 2001 From: enm10k Date: Thu, 16 Jun 2022 17:45:41 +0900 Subject: [PATCH 01/16] =?UTF-8?q?wip:=20URLSession=20=E3=81=AB=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=AD=E3=82=B7=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/URLSessionWebSocketChannel.swift | 34 +++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/Sora/URLSessionWebSocketChannel.swift b/Sora/URLSessionWebSocketChannel.swift index 58717822..7bd1f73f 100644 --- a/Sora/URLSessionWebSocketChannel.swift +++ b/Sora/URLSessionWebSocketChannel.swift @@ -22,11 +22,30 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe } func connect(delegateQueue: OperationQueue?) { + + let configuration = URLSessionConfiguration.default + configuration.connectionProxyDictionary = [ + kCFNetworkProxiesHTTPEnable: 1, + kCFNetworkProxiesHTTPProxy: "squid.example.com", + kCFNetworkProxiesHTTPPort: 3128, + + // 以下がないと https の通信にはプロキシーが利用されなかった + // 以下の問題がある + // - kCFNetworkProxiesHTTPS ... から始まるキーが iOS では利用できない + // - kCFStreamPropertyHTTPS ... から始まるキーは deprecated になっている + kCFStreamPropertyHTTPSProxyHost: "squid.example.com", + kCFStreamPropertyHTTPSProxyPort: 3128, + ] + Logger.debug(type: .webSocketChannel, message: "[\(host)] connecting") - urlSession = URLSession(configuration: .default, + urlSession = URLSession(configuration: configuration, delegate: self, delegateQueue: delegateQueue) + + Logger.info(type: .webSocketChannel, message: "proxy: \(String(describing: urlSession?.configuration.connectionProxyDictionary.debugDescription))") + webSocketTask = urlSession?.webSocketTask(with: url) + webSocketTask?.resume() receive() } @@ -133,7 +152,6 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe guard !isClosing else { return } - Logger.debug(type: .webSocketChannel, message: "[\(host)] \(#function)") if let onConnect = internalHandlers.onConnect { onConnect(self) @@ -173,4 +191,16 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe disconnect(error: error) } } + + func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + Logger.debug(type: .webSocketChannel, message: "[\(host)] \(#function) didReceive: challenge=\(challenge.protectionSpace.host):\(challenge.protectionSpace.port), \(challenge.protectionSpace.authenticationMethod)") + + switch challenge.protectionSpace.authenticationMethod { + case NSURLAuthenticationMethodHTTPBasic: + let credential = URLCredential(user: "hoge", password: "fuga", persistence: URLCredential.Persistence.forSession) + completionHandler(.useCredential, credential) + default: + completionHandler(.performDefaultHandling, nil) + } + } } From 0c7a74a3ae5e459199e0ac2aa14d9985de547b95 Mon Sep 17 00:00:00 2001 From: enm10k Date: Wed, 22 Jun 2022 10:39:26 +0900 Subject: [PATCH 02/16] =?UTF-8?q?Configuration.proxy=20=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=99=E3=82=8B=20&&=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 29 +++++++++++ Sora/SignalingChannel.swift | 8 ++-- Sora/URLSessionWebSocketChannel.swift | 69 ++++++++++++++++++--------- 3 files changed, 79 insertions(+), 27 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index 42aea33e..3d32ca92 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -7,6 +7,32 @@ private let defaultPublisherStreamId: String = "mainStream" private let defaultPublisherVideoTrackId: String = "mainVideo" private let defaultPublisherAudioTrackId: String = "mainAudio" +/** + プロキシに関する設定です + */ +public struct Proxy { + /// プロキシのホスト + var host: String + + /// ポート + var port: Int + + /// username + /// プロキシに認証がかかっている場合に指定する + var username: String? + + /// password + /// プロキシに認証がかかっている場合に指定する + var password: String? + + public init(host: String, port: Int, username: String? = nil, password: String? = nil) { + self.host = host + self.port = port + self.username = username + self.password = password + } +} + /** クライアントに関する設定です。 */ @@ -161,6 +187,9 @@ public struct Configuration { /// 詳細: https://sora-doc.shiguredo.jp/DATA_CHANNEL_SIGNALING#07c227 public var ignoreDisconnectWebSocket: Bool? + /// プロキシに関する設定 + public var proxy: Proxy? + // MARK: - イベントハンドラ /// WebSocket チャネルに関するイベントハンドラ diff --git a/Sora/SignalingChannel.swift b/Sora/SignalingChannel.swift index 2bfffee6..964bfab3 100644 --- a/Sora/SignalingChannel.swift +++ b/Sora/SignalingChannel.swift @@ -116,8 +116,8 @@ class SignalingChannel { return uniqueUrls } - private func setUpWebSocketChannel(url: URL) -> URLSessionWebSocketChannel { - let ws = URLSessionWebSocketChannel(url: url) + private func setUpWebSocketChannel(url: URL, proxy: Proxy?) -> URLSessionWebSocketChannel { + let ws = URLSessionWebSocketChannel(url: url, proxy: proxy) // 接続成功時 ws.internalHandlers.onConnect = { [weak self] webSocketChannel in @@ -210,7 +210,7 @@ class SignalingChannel { let urlCandidates = unique(urls: configuration.urlCandidates) Logger.info(type: .signalingChannel, message: "urlCandidates: \(urlCandidates)") for url in urlCandidates { - let ws = setUpWebSocketChannel(url: url) + let ws = setUpWebSocketChannel(url: url, proxy: configuration.proxy) Logger.info(type: .signalingChannel, message: "connecting to \(String(describing: ws.url))") ws.connect(delegateQueue: queue) webSocketChannelCandidates.append(ws) @@ -233,7 +233,7 @@ class SignalingChannel { return } - let ws = setUpWebSocketChannel(url: newUrl) + let ws = setUpWebSocketChannel(url: newUrl, proxy: configuration.proxy) ws.connect(delegateQueue: queue) } diff --git a/Sora/URLSessionWebSocketChannel.swift b/Sora/URLSessionWebSocketChannel.swift index 7bd1f73f..84da27c8 100644 --- a/Sora/URLSessionWebSocketChannel.swift +++ b/Sora/URLSessionWebSocketChannel.swift @@ -3,6 +3,7 @@ import Foundation @available(iOS 13, *) class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDelegate, URLSessionWebSocketDelegate { let url: URL + let proxy: Proxy? var handlers = WebSocketChannelHandlers() var internalHandlers = WebSocketChannelInternalHandlers() var isClosing = false @@ -17,35 +18,52 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe var urlSession: URLSession? var webSocketTask: URLSessionWebSocketTask? - init(url: URL) { + init(url: URL, proxy: Proxy?) { self.url = url + self.proxy = proxy } func connect(delegateQueue: OperationQueue?) { - - let configuration = URLSessionConfiguration.default - configuration.connectionProxyDictionary = [ - kCFNetworkProxiesHTTPEnable: 1, - kCFNetworkProxiesHTTPProxy: "squid.example.com", - kCFNetworkProxiesHTTPPort: 3128, - - // 以下がないと https の通信にはプロキシーが利用されなかった - // 以下の問題がある - // - kCFNetworkProxiesHTTPS ... から始まるキーが iOS では利用できない - // - kCFStreamPropertyHTTPS ... から始まるキーは deprecated になっている - kCFStreamPropertyHTTPSProxyHost: "squid.example.com", - kCFStreamPropertyHTTPSProxyPort: 3128, - ] - + let configuration = URLSessionConfiguration.ephemeral + + if let proxy = proxy { + // TODO: Basic 認証が1回成功すると、結果が一定時間キャッシュされている模様 + // 具体的には urlSession(_:didReceive:completionHandler:) が authenticationMethod: NSURLAuthenticationMethodHTTPBasic で呼ばれなくなる + // ただ、サーバー側で tshark を使って (*1) 確認したところ、 CONNECT メッセージに Proxy-Authorization ヘッダーは付与されている + // URLSession のキャッシュを消すべく試行錯誤したが改善することができなかった + // + // *1 ... 確認時に使用した tshark のコマンド: tshark -V -Y 'http.request.method == "CONNECT"' + configuration.urlCache = nil + configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData + configuration.urlCredentialStorage = nil + + configuration.connectionProxyDictionary = [ + kCFNetworkProxiesHTTPEnable: 1, + kCFNetworkProxiesHTTPProxy: proxy.host, + kCFNetworkProxiesHTTPPort: proxy.port, + + // NOTE: `kCFStreamPropertyHTTPS` から始まるキーは deprecated になっているが、 + // それらを置き換える形で導入されたと思われる `kCFNetworkProxiesHTTPS` は、2022年6月時点で macOS からしか利用できない + // https://developer.apple.com/documentation/cfnetwork/kcfnetworkproxieshttpsproxy + // + // 以下のページによるとバグではないか? とのこと + // https://developer.apple.com/forums/thread/19356 + // + // "HTTPSProxy", "HTTPSPort" などの文字列をキーの代わりに指定して Xcode の警告を消すことも可能 + kCFStreamPropertyHTTPSProxyHost: proxy.host, + kCFStreamPropertyHTTPSProxyPort: proxy.port, + ] + + Logger.info(type: .webSocketChannel, message: "proxy: \(String(describing: configuration.connectionProxyDictionary.debugDescription))") + } + Logger.debug(type: .webSocketChannel, message: "[\(host)] connecting") urlSession = URLSession(configuration: configuration, delegate: self, delegateQueue: delegateQueue) - - Logger.info(type: .webSocketChannel, message: "proxy: \(String(describing: urlSession?.configuration.connectionProxyDictionary.debugDescription))") - + webSocketTask = urlSession?.webSocketTask(with: url) - + webSocketTask?.resume() receive() } @@ -191,13 +209,18 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe disconnect(error: error) } } - + func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { Logger.debug(type: .webSocketChannel, message: "[\(host)] \(#function) didReceive: challenge=\(challenge.protectionSpace.host):\(challenge.protectionSpace.port), \(challenge.protectionSpace.authenticationMethod)") - + switch challenge.protectionSpace.authenticationMethod { case NSURLAuthenticationMethodHTTPBasic: - let credential = URLCredential(user: "hoge", password: "fuga", persistence: URLCredential.Persistence.forSession) + guard let username = proxy?.username, let password = proxy?.password else { + completionHandler(.performDefaultHandling, nil) + return + } + + let credential = URLCredential(user: username, password: password, persistence: URLCredential.Persistence.forSession) completionHandler(.useCredential, credential) default: completionHandler(.performDefaultHandling, nil) From 478d03e32563c2091ef0baa6bd35258f15301c47 Mon Sep 17 00:00:00 2001 From: enm10k Date: Wed, 22 Jun 2022 18:34:31 +0900 Subject: [PATCH 03/16] =?UTF-8?q?URLSession=20=E3=81=A8=20URLSessionTask?= =?UTF-8?q?=20=E3=81=A7=E3=81=AF=E5=AE=9F=E8=A3=85=E3=81=99=E3=81=B9?= =?UTF-8?q?=E3=81=8D=E3=82=A4=E3=83=99=E3=83=B3=E3=83=88=E3=83=8F=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=83=A9=E3=83=BC=E3=81=8C=E5=88=A5=E3=81=A0=E3=81=A3?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 1 + Sora/URLSessionWebSocketChannel.swift | 51 +++++++++++++++++++-------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index 3d32ca92..bab9d785 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -19,6 +19,7 @@ public struct Proxy { /// username /// プロキシに認証がかかっている場合に指定する + /// TODO: username と password を別の型にまとめて non-optional にしたい var username: String? /// password diff --git a/Sora/URLSessionWebSocketChannel.swift b/Sora/URLSessionWebSocketChannel.swift index 84da27c8..fae81c12 100644 --- a/Sora/URLSessionWebSocketChannel.swift +++ b/Sora/URLSessionWebSocketChannel.swift @@ -33,9 +33,6 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe // URLSession のキャッシュを消すべく試行錯誤したが改善することができなかった // // *1 ... 確認時に使用した tshark のコマンド: tshark -V -Y 'http.request.method == "CONNECT"' - configuration.urlCache = nil - configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData - configuration.urlCredentialStorage = nil configuration.connectionProxyDictionary = [ kCFNetworkProxiesHTTPEnable: 1, @@ -210,20 +207,46 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe } } - func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { - Logger.debug(type: .webSocketChannel, message: "[\(host)] \(#function) didReceive: challenge=\(challenge.protectionSpace.host):\(challenge.protectionSpace.port), \(challenge.protectionSpace.authenticationMethod)") + // TODO: エラー発生時にプロキシの設定を出力する + func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + // コードを短くするために変数を定義 + let ps = challenge.protectionSpace + let previousFailureCount = challenge.previousFailureCount + + // 既に失敗している場合はチャレンジを中止する + guard previousFailureCount == 0 else { + let message = "[\(host)] \(#function): Basic authentication failed." + Logger.info(type: .webSocketChannel, message: message) + completionHandler(.cancelAuthenticationChallenge, nil) + + // WebSocket 接続完了前のエラーなので webSocketError ではなく signalingChannelError として扱っている + // webSocketError の場合、条件によっては Sora に type: disconnect を送信する必要があるが、今回は接続完了前なので不要 + disconnect(error: SoraError.signalingChannelError(reason: message)) + return + } - switch challenge.protectionSpace.authenticationMethod { - case NSURLAuthenticationMethodHTTPBasic: - guard let username = proxy?.username, let password = proxy?.password else { - completionHandler(.performDefaultHandling, nil) - return - } + Logger.debug(type: .webSocketChannel, message: "[\(host)] \(#function): challenge=\(ps.host):\(ps.port), \(ps.authenticationMethod) previousFailureCount: \(previousFailureCount)") - let credential = URLCredential(user: username, password: password, persistence: URLCredential.Persistence.forSession) - completionHandler(.useCredential, credential) - default: + // Basic 認証のみに対応している + // それ以外の認証方法は .performDefaultHandling で処理を続ける + guard ps.authenticationMethod == NSURLAuthenticationMethodHTTPBasic else { completionHandler(.performDefaultHandling, nil) + return } + + // username と password をチェック + guard let username = proxy?.username, let password = proxy?.password else { + let message = "[\(host)] \(#function): Basic authentication required, but authentication information is insufficient." + Logger.info(type: .webSocketChannel, message: message) + completionHandler(.cancelAuthenticationChallenge, nil) + + // WebSocket 接続完了前のエラーなので webSocketError ではなく signalingChannelError として扱っている + // webSocketError の場合、条件によっては Sora に type: disconnect を送信する必要があるが、今回は接続完了前なので不要 + disconnect(error: SoraError.signalingChannelError(reason: message)) + return + } + + let credential = URLCredential(user: username, password: password, persistence: .forSession) + completionHandler(.useCredential, credential) } } From c3e0321d7dc799f3a48ac7e957e3bf948a06718e Mon Sep 17 00:00:00 2001 From: enm10k Date: Thu, 23 Jun 2022 11:08:10 +0900 Subject: [PATCH 04/16] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=A8=E3=83=AD=E3=82=B0=E3=82=92=E4=BF=AE=E6=AD=A3=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 10 ++++++++-- Sora/URLSessionWebSocketChannel.swift | 18 +++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index bab9d785..651cbdc4 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -10,7 +10,7 @@ private let defaultPublisherAudioTrackId: String = "mainAudio" /** プロキシに関する設定です */ -public struct Proxy { +public struct Proxy: CustomStringConvertible { /// プロキシのホスト var host: String @@ -19,7 +19,6 @@ public struct Proxy { /// username /// プロキシに認証がかかっている場合に指定する - /// TODO: username と password を別の型にまとめて non-optional にしたい var username: String? /// password @@ -29,9 +28,16 @@ public struct Proxy { public init(host: String, port: Int, username: String? = nil, password: String? = nil) { self.host = host self.port = port + + // TODO: username と password の片方が設定された場合、エラーにする? + // もしくは、片方のみ設定出来ない API を検討する self.username = username self.password = password } + + public var description: String { + "host=\(host) port=\(port) username=\(username ?? "") password=\(String(repeating: "*", count: password?.count ?? 0))" + } } /** diff --git a/Sora/URLSessionWebSocketChannel.swift b/Sora/URLSessionWebSocketChannel.swift index fae81c12..5cd2f5cd 100644 --- a/Sora/URLSessionWebSocketChannel.swift +++ b/Sora/URLSessionWebSocketChannel.swift @@ -27,17 +27,10 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe let configuration = URLSessionConfiguration.ephemeral if let proxy = proxy { - // TODO: Basic 認証が1回成功すると、結果が一定時間キャッシュされている模様 - // 具体的には urlSession(_:didReceive:completionHandler:) が authenticationMethod: NSURLAuthenticationMethodHTTPBasic で呼ばれなくなる - // ただ、サーバー側で tshark を使って (*1) 確認したところ、 CONNECT メッセージに Proxy-Authorization ヘッダーは付与されている - // URLSession のキャッシュを消すべく試行錯誤したが改善することができなかった - // - // *1 ... 確認時に使用した tshark のコマンド: tshark -V -Y 'http.request.method == "CONNECT"' - configuration.connectionProxyDictionary = [ - kCFNetworkProxiesHTTPEnable: 1, kCFNetworkProxiesHTTPProxy: proxy.host, kCFNetworkProxiesHTTPPort: proxy.port, + kCFNetworkProxiesHTTPEnable: 1, // NOTE: `kCFStreamPropertyHTTPS` から始まるキーは deprecated になっているが、 // それらを置き換える形で導入されたと思われる `kCFNetworkProxiesHTTPS` は、2022年6月時点で macOS からしか利用できない @@ -49,6 +42,10 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe // "HTTPSProxy", "HTTPSPort" などの文字列をキーの代わりに指定して Xcode の警告を消すことも可能 kCFStreamPropertyHTTPSProxyHost: proxy.host, kCFStreamPropertyHTTPSProxyPort: proxy.port, + + // NOTE: kCFNetworkProxiesHTTPSProxy に相当するキーが `kCFStreamPropertyHTTPS` から始まるキーとして存在しなかったので、直接文字列で指定する + // https://developer.apple.com/documentation/cfnetwork + "HTTPSEnable": 1, ] Logger.info(type: .webSocketChannel, message: "proxy: \(String(describing: configuration.connectionProxyDictionary.debugDescription))") @@ -207,7 +204,6 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe } } - // TODO: エラー発生時にプロキシの設定を出力する func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { // コードを短くするために変数を定義 let ps = challenge.protectionSpace @@ -215,7 +211,7 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe // 既に失敗している場合はチャレンジを中止する guard previousFailureCount == 0 else { - let message = "[\(host)] \(#function): Basic authentication failed." + let message = "[\(host)] \(#function): Basic authentication failed. proxy => \(String(describing: proxy))" Logger.info(type: .webSocketChannel, message: message) completionHandler(.cancelAuthenticationChallenge, nil) @@ -236,7 +232,7 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe // username と password をチェック guard let username = proxy?.username, let password = proxy?.password else { - let message = "[\(host)] \(#function): Basic authentication required, but authentication information is insufficient." + let message = "[\(host)] \(#function): Basic authentication required, but authentication information is insufficient. proxy => \(String(describing: proxy))" Logger.info(type: .webSocketChannel, message: message) completionHandler(.cancelAuthenticationChallenge, nil) From 15c9324e78999698874f7ea662423beaf055c95a Mon Sep 17 00:00:00 2001 From: miosakuma Date: Wed, 29 Jun 2022 18:12:49 +0900 Subject: [PATCH 05/16] =?UTF-8?q?=E5=A4=89=E6=9B=B4=E5=B1=A5=E6=AD=B4?= =?UTF-8?q?=E3=81=A7=20CHANGE=20=E3=82=92=E5=85=88=E9=A0=AD=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 516 ++++++++++++++++++++++++++--------------------------- 1 file changed, 258 insertions(+), 258 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index ff157551..828c1472 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,11 @@ # 変更履歴 +- CHANGE + - 下位互換のない変更 - UPDATE - 下位互換がある変更 - ADD - 下位互換がある追加 -- CHANGE - - 下位互換のない変更 - FIX - バグ修正 @@ -13,6 +13,12 @@ ## 2022.4.0 +- [CHANGE] mid を必須にする + - この修正の結果、 type: offer に mid が含まれない場合は、エラーになります + - @enm10k +- [CHANGE] `Configuration.spotlightEnabled == .enabled` の際に、自動的にサイマルキャストを有効化しない + - サイマルキャストを有効化する場合は明示的に `Configuration.simulcastEnabled == true` を設定してください + - @enm10k - [UPDATE] システム条件を変更する - macOS 12.3 以降 - WebRTC SFU Sora 2022.1 以降 @@ -22,12 +28,6 @@ - [ADD] Sora の bundle_id に対応する - `Configuration.bundleId` を追加する - @enm10k -- [CHANGE] mid を必須にする - - この修正の結果、 type: offer に mid が含まれない場合は、エラーになります - - @enm10k -- [CHANGE] `Configuration.spotlightEnabled == .enabled` の際に、自動的にサイマルキャストを有効化しない - - サイマルキャストを有効化する場合は明示的に `Configuration.simulcastEnabled == true` を設定してください - - @enm10k ## 2022.3.0 @@ -46,6 +46,11 @@ ## 2022.2.0 +- [CHANGE] DataChannel 経由で受信したメッセージのうち label が signaling, push, notify のものは `MediaChannelHandlers.onReceiveSignaling` が呼ばれるように修正する + - @enm10k +- [CHANGE] `MediaChannel.connectedUrl`を更新するタイミングを修正する + - type: connect を送信するタイミングで `MediaChannel.connectedUrl` を更新していたが、 type: offer を受信したタイミングで値を更新するように修正 + - @enm10k - [UPDATE] WebRTC 99.4844.1.0 に上げる - @miosakuma - [ADD] メッセージング機能に対応する @@ -53,11 +58,6 @@ - [ADD] `MediaChannel.contactUrl` を追加する - `MediaChannel.contactUrl` は、最初に type: connect メッセージを送信した Sora のシグナリング URL - @enm10k -- [CHANGE] DataChannel 経由で受信したメッセージのうち label が signaling, push, notify のものは `MediaChannelHandlers.onReceiveSignaling` が呼ばれるように修正する - - @enm10k -- [CHANGE] `MediaChannel.connectedUrl`を更新するタイミングを修正する - - type: connect を送信するタイミングで `MediaChannel.connectedUrl` を更新していたが、 type: offer を受信したタイミングで値を更新するように修正 - - @enm10k ## 2022.1.1 @@ -68,21 +68,6 @@ ## 2022.1.0 -- [UPDATE] システム条件を変更する - - macOS 12.2 以降 - - Xcode 13.2 - - Swift 5.5.2 - - @miosakuma -- [UPDATE] WebRTC 98.4758.0.0 に上げる - - @miosakuma -- [UPDATE] MediaStream から MediaChannel にアクセスできるようにする - - @enm10k -- [ADD] 複数シグナリング URL の指定に対応する - - `Configuration.url` を廃止して `Configuration.urlCandidates` を追加する - - `MediaChannel.connectedUrl` を追加する - - @enm10k -- [ADD] type: rediret に対応する - - @enm10k - [CHANGE] スポットライトレガシーを削除する - @miosakuma - [CHANGE] WebSocketChannel プロトコルを廃止する @@ -101,6 +86,21 @@ - [CHANGE] `MediaChannel.native` の型を `RTCPeerConnection` から `RTCPeerConnection?` に変更する - PeerChannel で force unwrapping している箇所を修正する際に、併せて修正した - @enm10k +- [UPDATE] システム条件を変更する + - macOS 12.2 以降 + - Xcode 13.2 + - Swift 5.5.2 + - @miosakuma +- [UPDATE] WebRTC 98.4758.0.0 に上げる + - @miosakuma +- [UPDATE] MediaStream から MediaChannel にアクセスできるようにする + - @enm10k +- [ADD] 複数シグナリング URL の指定に対応する + - `Configuration.url` を廃止して `Configuration.urlCandidates` を追加する + - `MediaChannel.connectedUrl` を追加する + - @enm10k +- [ADD] type: rediret に対応する + - @enm10k - [FIX] CameraVideoCapturer で force unwrapping していた箇所を修正する - @enm10k - [FIX] VideoView に debugMode = true を設定した際にメモリー・リークが発生する問題を修正する @@ -116,6 +116,14 @@ ## 2021.3.0 +- [CHANGE] PeerChannel, SignalingChannel protocol を削除する + - `Configuration.peerChannelType` を廃止 + - `Configuration.signalingChannelType` を廃止 + - `Configuration.peerChannelHandlers` を廃止 + - `Configuration.signalingChannelHandlers` を廃止 + - `MediaChannel.native` を追加 + - `MediaChannel.webSocketChannel` を追加 + - @szktty @enm10k - [UPDATE] システム条件を変更する - macOS 12.0 以降 - Xcode 13.1 @@ -128,14 +136,6 @@ - `Configuration.dataChannelSignaling` を追加 - `Configuration.ignoreDisconnectWebSocket` を追加 - @szktty @enm10k -- [CHANGE] PeerChannel, SignalingChannel protocol を削除する - - `Configuration.peerChannelType` を廃止 - - `Configuration.signalingChannelType` を廃止 - - `Configuration.peerChannelHandlers` を廃止 - - `Configuration.signalingChannelHandlers` を廃止 - - `MediaChannel.native` を追加 - - `MediaChannel.webSocketChannel` を追加 - - @szktty @enm10k - [FIX] Sora 接続時に audioEnabled = false を設定すると answer 生成に失敗してしまう問題についてのワークアラウンドを削除する - @miosakuma @@ -146,6 +146,18 @@ ## 2021.2 +- [CHANGE] 接続開始時のカメラ・デバイスを指定可能にする + - `Configuration.cameraSettings.position` に `.front` または `.back` を設定して、接続開始時のカメラ・デバイスを指定します + - この修正に伴い、以下の API が変更されました + - `CameraVideoCapturer` の API を破壊的に変更 + - `CameraVideoCapturer.Settings` を `CameraSettings` にリネーム + - `VideoCapturerHandlers` を `CameraVideoCapturerHandlers` にリネーム + - `VideoCapturer` を廃止 + - `VideoCapturerDevice` を廃止 + - `CameraPosition` を廃止 + - `Configuration.videoCapturerDevice` を廃止 + - `MediaStream.videoCapturer` を廃止 + - @szktty @enm10k - [UPDATE] Swift Package Manager に対応する - @miosakuma @enm10k - [UPDATE] WebRTC 93.4577.8.0 に上げる @@ -162,18 +174,6 @@ - [UPDATE] SoraDispatcher を追加する - libwebrtc 内部で利用されているディスパッチ・キューをラップし、 SDK のユーザーから利用しやすくした - @szktty @enm10k -- [CHANGE] 接続開始時のカメラ・デバイスを指定可能にする - - `Configuration.cameraSettings.position` に `.front` または `.back` を設定して、接続開始時のカメラ・デバイスを指定します - - この修正に伴い、以下の API が変更されました - - `CameraVideoCapturer` の API を破壊的に変更 - - `CameraVideoCapturer.Settings` を `CameraSettings` にリネーム - - `VideoCapturerHandlers` を `CameraVideoCapturerHandlers` にリネーム - - `VideoCapturer` を廃止 - - `VideoCapturerDevice` を廃止 - - `CameraPosition` を廃止 - - `Configuration.videoCapturerDevice` を廃止 - - `MediaStream.videoCapturer` を廃止 - - @szktty @enm10k - [FIX] 接続、切断の検知に RTCPeerConnectionState を参照する - @enm10k - [FIX] 接続終了後に MediaChannel のメモリが解放されずに残り続ける事象を修正する @@ -181,20 +181,6 @@ ## 2021.1 -- [UPDATE] システム条件を変更する - - Xcode 12.5 - - Swift 5.4 - - CocoaPods 1.10.1 - - @miosakuma -- [UPDATE] サイマルキャストで VP8 / H.264 (ハードウェアアクセラレーション含む) に対応する - - @szktty @enm10k -- [UPDATE] WebRTC 91.4472.9.1 に上げる - - @enm10k -- [UPDATE] AV1 に対応する - - @enm10k -- [ADD] libwebrtc のログレベルを設定する API を追加 - - `Sora.setWebRTCLogLevel(_:)` - - @szktty - [CHANGE] スポットライトに関する API を変更する - Sora のスポットライトレガシー機能を利用するための API を `Sora.useSpotlightLegacy()` に変更 - `Configuration.activeSpeakerLimit` を非推奨にして、 `Configuration.spotlightNumber` に変更 @@ -222,6 +208,20 @@ - @szktty - [CHANGE] DeviceModel を廃止し、 hw.machine の結果を表示する - @enm10k +- [UPDATE] システム条件を変更する + - Xcode 12.5 + - Swift 5.4 + - CocoaPods 1.10.1 + - @miosakuma +- [UPDATE] サイマルキャストで VP8 / H.264 (ハードウェアアクセラレーション含む) に対応する + - @szktty @enm10k +- [UPDATE] WebRTC 91.4472.9.1 に上げる + - @enm10k +- [UPDATE] AV1 に対応する + - @enm10k +- [ADD] libwebrtc のログレベルを設定する API を追加 + - `Sora.setWebRTCLogLevel(_:)` + - @szktty - [FIX] SignalingNotify に漏れていたフィールドを追加する - `SignalingNotify.authnMetadata` - `SignalingNotify.authzMetadata` @@ -252,20 +252,13 @@ ## 2020.7 -- [UPDATE] WebRTC 86.4240.10.0 に上げる - - @szktty - [CHANGE] `AudioMode.swift` がターゲット含まれておらずビルドできなかった事象を修正する - @szktty +- [UPDATE] WebRTC 86.4240.10.0 に上げる + - @szktty ## 2020.6 -- [UPDATE] システム条件を更新する - - Xcode 12.0 - - Swift 5.3 - - CocoaPods 1.9.3 - - @szktty -- [UPDATE] WebRTC M86 に対応する - - @szktty - [CHANGE] API: スポットライトに関する API - `Configuration.spotlight`: 非推奨 - `Configuration.spotlightEnabled`: 追加 @@ -276,18 +269,18 @@ - `AudioMode`: 追加 - `AudioOutput`: 追加 - @szktty +- [UPDATE] システム条件を更新する + - Xcode 12.0 + - Swift 5.3 + - CocoaPods 1.9.3 + - @szktty +- [UPDATE] WebRTC M86 に対応する + - @szktty - [FIX] API: `Sora.connect()`: タイムアウト時にハンドラが実行されない事象を修正する - @szktty ## 2020.5 -- [UPDATE] システム条件を更新する - - Xcode 11.6 - - Swift 5.2.4 - - WebRTC SFU Sora 2020.1 以降 - - @szktty -- [UPDATE] WebRTC M84 に対応する - - @szktty - [CHANGE] シグナリング pong に統計情報を含める - @szktty - [CHANGE] API: 次のイベントハンドラのクラスにコンストラクタを追加する @@ -299,6 +292,13 @@ - ``VideoCapturerHandlers`` - ``WebSocketChannelHandlers`` - @itoyama @szktty +- [UPDATE] システム条件を更新する + - Xcode 11.6 + - Swift 5.2.4 + - WebRTC SFU Sora 2020.1 以降 + - @szktty +- [UPDATE] WebRTC M84 に対応する + - @szktty - [FIX] API: `Sora.connect()`: 接続先ホストが存在しない場合にハンドラが実行されない事象を修正する - @szktty @@ -346,13 +346,6 @@ 本バージョンよりバージョン表記を「リリース年.リリース回数」に変更する -- [UPDATE] システム条件を更新する - - Xcode 11.3 - - CocoaPods 1.8.4 以降 - - WebRTC SFU Sora 19.10.3 以降 - - @szktty -- [UPDATE] WebRTC M79 に対応する - - @szktty - [CHANGE] Carthage の使用を止める - @szktty - [CHANGE] シグナリングに含める各種バージョン情報を変更する @@ -373,6 +366,13 @@ - @szktty - [CHANGE] API: `Role`: `publisher`, `subscriber`, `group`, `groupSub` を非推奨にする - @szktty +- [UPDATE] システム条件を更新する + - Xcode 11.3 + - CocoaPods 1.8.4 以降 + - WebRTC SFU Sora 19.10.3 以降 + - @szktty +- [UPDATE] WebRTC M79 に対応する + - @szktty ## 2.6.0 @@ -392,18 +392,29 @@ ## 2.4.1 -- [ADD] 対応アーキテクチャに x86_64 を追加する (シミュレーターの動作は未保証) - - @szktty -- [ADD] シグナリングに SDK と端末の情報を含めるようにする - - @szktty - [CHANGE] 依存するライブラリを変更する (`Cartfile`) - sora-webrtc-ios 76.3.1 -> shiguredo-webrtc-ios 76.3.1 - @szktty - [CHANGE] 対応アーキテクチャから armv7 を外する - @szktty +- [ADD] 対応アーキテクチャに x86_64 を追加する (シミュレーターの動作は未保証) + - @szktty +- [ADD] シグナリングに SDK と端末の情報を含めるようにする + - @szktty ## 2.4.0 +- [CHANGE] VAD 機能を削除する + - @szktty +- [CHANGE] API: シグナリングに関する API の名前を変更する + - `SignalingMessage` -> `Signaling` + - `SignalingNotificationEventType` -> `SignalingNotifyEventType` + - `SignalingConnectMessage` -> `SignalingConnect` + - `SignalingOfferMessage` -> `SignalingOffer` + - `SignalingOfferMessage.Configuration` -> `SignalingOffer.Configuration` + - `SignalingPongMessage` -> `SignalingPong` + - `SignalingPushMessage` -> `SignalingPush` + - @szktty - [UPDATE] システム条件を更新する - Xcode 10.3 - @szktty @@ -449,28 +460,17 @@ - @szktty - [ADD] API: `Signaling`: 追加する - @szktty -- [CHANGE] VAD 機能を削除する - - @szktty -- [CHANGE] API: シグナリングに関する API の名前を変更する - - `SignalingMessage` -> `Signaling` - - `SignalingNotificationEventType` -> `SignalingNotifyEventType` - - `SignalingConnectMessage` -> `SignalingConnect` - - `SignalingOfferMessage` -> `SignalingOffer` - - `SignalingOfferMessage.Configuration` -> `SignalingOffer.Configuration` - - `SignalingPongMessage` -> `SignalingPong` - - `SignalingPushMessage` -> `SignalingPush` - - @szktty ## 2.3.2 -- [ADD] API: シグナリング "notify" の "connection_id" プロパティに対応する - - @szktty -- [ADD] API: ``SignalingNotifyMessage``: ``connectionId`` プロパティを追加する - - @szktty - [CHANGE] API: ``SDPSemantics``: ``case default`` を削除する - @szktty - [CHANGE] SDP セマンティクスのデフォルトを Unified Plan に変更する - @szktty +- [ADD] API: シグナリング "notify" の "connection_id" プロパティに対応する + - @szktty +- [ADD] API: ``SignalingNotifyMessage``: ``connectionId`` プロパティを追加する + - @szktty - [FIX] 接続状態によってシグナリング "notify" が無視される現象を修正する - @szktty @@ -481,6 +481,10 @@ ## 2.3.0 +- [CHANGE] マルチストリーム時に強制的に Plan B に設定していたのを止めた + - @szktty +- [CHANGE] 未知のシグナリングメッセージを受信するら例外を発生するように変更する + - @szktty - [UPDATE] システム条件を更新する - WebRTC SFU Sora 19.04.0 以降 - macOS 10.14.4 以降 @@ -491,10 +495,6 @@ - "spotlight.changed" - "network.status" - @szktty -- [CHANGE] マルチストリーム時に強制的に Plan B に設定していたのを止めた - - @szktty -- [CHANGE] 未知のシグナリングメッセージを受信するら例外を発生するように変更する - - @szktty ## 2.2.1 @@ -541,6 +541,8 @@ ## 2.1.1 +- [CHANGE] API: ``MediaStream``: ``audioVolume`` プロパティを非推奨にする + - @szktty - [UPDATE] システム条件を更新する - macOS 10.13.2 以降 - Xcode 9.3 @@ -550,8 +552,6 @@ - @szktty - [ADD] API: ``MediaStream``: ``remoteAudioVolume`` プロパティを追加する - @szktty -- [CHANGE] API: ``MediaStream``: ``audioVolume`` プロパティを非推奨にする - - @szktty - [FIX] API: ``MediaStream``: 配信中に ``videoEnabled`` プロパティまたは ``audioEnabled`` プロパティで映像か音声を無効にすると、有効に戻しても他のクライアントに配信が再開されない現象を修正する - @szktty - [FIX] API: ``WebRTCInfo``: ``shortRevision``: 戻り値の文字列が 7 桁でない現象を修正する @@ -577,16 +577,6 @@ ## 2.0.3 -- [UPDATE] WebRTC M63 に対応する - - @szktty -- [UPDATE] SDWebImage 4.2.2 に対応する - - @szktty -- [ADD] API: ``WebSocketChannelHandlers``: ``onDisconnectHandler`` を追加する - - @szktty -- [ADD] API: ``SignalingChannelHandlers``: ``onDisconnectHandler`` を追加する - - @szktty -- [ADD] API: ``PeerChannelHandlers``: ``onDisconnectHandler`` を追加する - - @szktty - [CHANGE] API: ``SoraError``: WebSocket に関するエラーを次の二つに分割する - ``webSocketClosed(statusCode:reason:)`` - ``webSocketError()`` @@ -599,6 +589,16 @@ - @szktty - [CHANGE] API: ``MediaChannelHandlers``: ``onFailureHandler`` を削除する - @szktty +- [UPDATE] WebRTC M63 に対応する + - @szktty +- [UPDATE] SDWebImage 4.2.2 に対応する + - @szktty +- [ADD] API: ``WebSocketChannelHandlers``: ``onDisconnectHandler`` を追加する + - @szktty +- [ADD] API: ``SignalingChannelHandlers``: ``onDisconnectHandler`` を追加する + - @szktty +- [ADD] API: ``PeerChannelHandlers``: ``onDisconnectHandler`` を追加する + - @szktty - [FIX] API: ``MediaChannel``: ``PeerChannel`` の接続解除時に ``MediaChannel`` の状態が接続解除にならない現象を修正する - @szktty @@ -628,6 +628,14 @@ 設計と API を大きく見直した。 +- [CHANGE] 依存するフレームワークから Unbox.framework を削除する + - @szktty +- [CHANGE] WebRTC のネイティブ API (主にクラスやプロトコル名の接頭辞が ``RTC`` の API) を非公開にする + - @szktty +- [CHANGE] 通信を行うオブジェクト (WebSocket 接続、シグナリング接続、ピア接続、メディアストリーム) をプロトコルに変更する (デフォルトの実装は ``private``) + - @szktty +- [CHANGE] 内部で使用する WebSocket の API (SRWebSocket.framework の API) を非公開にする + - @szktty - [UPDATE] WebRTC M62 に対応する - @szktty - [UPDATE] アーキテクチャ armv7 に対応する @@ -648,17 +656,62 @@ - @szktty - [ADD] 映像フレームの編集を可能にする - @szktty -- [CHANGE] 依存するフレームワークから Unbox.framework を削除する - - @szktty -- [CHANGE] WebRTC のネイティブ API (主にクラスやプロトコル名の接頭辞が ``RTC`` の API) を非公開にする - - @szktty -- [CHANGE] 通信を行うオブジェクト (WebSocket 接続、シグナリング接続、ピア接続、メディアストリーム) をプロトコルに変更する (デフォルトの実装は ``private``) - - @szktty -- [CHANGE] 内部で使用する WebSocket の API (SRWebSocket.framework の API) を非公開にする - - @szktty ### API +- [CHANGE] 次のクラス、構造体、列挙体、プロトコルを削除する + - ``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`` に実装する + - @szktty +- [CHANGE] ``Notification`` の使用を中止し、次の関連する構造体と列挙体を削除する + - ``Connection.NotificationKey`` + - ``Connection.NotificationKey.UserInfo`` + - ``MediaConnection.NotificationKey`` + - ``MediaConnection.NotificationKey.UserInfo`` + - ``MediaStream.NotificationKey`` + - ``MediaStream.NotificationKey.UserInfo`` + - @szktty +- [CHANGE] ``AudioCodec`` + - ``.Opus`` を ``.opus`` に変更する + - ``.PCMU`` を ``.pcmu`` に変更する + - @szktty +- [CHANGE] ``MediaStream`` + - クラスからプロトコルに変更し、 API を一新する +- [CHANGE] ``VideoCodec`` + - ``.VP8`` を ``.vp8`` に変更する + - ``.VP9`` を ``.vp9`` に変更する + - ``.H264`` を ``.h264`` に変更する + - @szktty +- [CHANGE] ``VideoFrame`` + - プロトコルから列挙体に変更し、 API を一新する + - @szktty +- [CHANGE]] ``VideoRenderer`` + - ``onChangedSize(_:)`` を ``onChange(size:)`` に変更する + - ``renderVideoFrame(_:)`` を ``render(videoFrame:)`` に変更する + - @szktty - [ADD] 次のクラスを追加する - ``CameraVideoCapturer`` - ``CameraVideoCapturer.Settings`` @@ -713,59 +766,6 @@ - [ADD] ``Role`` - ``.group`` を追加する - @szktty -- [CHANGE] 次のクラス、構造体、列挙体、プロトコルを削除する - - ``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`` に実装する - - @szktty -- [CHANGE] ``Notification`` の使用を中止し、次の関連する構造体と列挙体を削除する - - ``Connection.NotificationKey`` - - ``Connection.NotificationKey.UserInfo`` - - ``MediaConnection.NotificationKey`` - - ``MediaConnection.NotificationKey.UserInfo`` - - ``MediaStream.NotificationKey`` - - ``MediaStream.NotificationKey.UserInfo`` - - @szktty -- [CHANGE] ``AudioCodec`` - - ``.Opus`` を ``.opus`` に変更する - - ``.PCMU`` を ``.pcmu`` に変更する - - @szktty -- [CHANGE] ``MediaStream`` - - クラスからプロトコルに変更し、 API を一新する -- [CHANGE] ``VideoCodec`` - - ``.VP8`` を ``.vp8`` に変更する - - ``.VP9`` を ``.vp9`` に変更する - - ``.H264`` を ``.h264`` に変更する - - @szktty -- [CHANGE] ``VideoFrame`` - - プロトコルから列挙体に変更し、 API を一新する - - @szktty -- [CHANGE]] ``VideoRenderer`` - - ``onChangedSize(_:)`` を ``onChange(size:)`` に変更する - - ``renderVideoFrame(_:)`` を ``render(videoFrame:)`` に変更する - - @szktty ## 1.2.5 @@ -774,12 +774,12 @@ ## 1.2.4 -- [UPDATE] armv7 に対応する - - @szktty - [CHANGE] API: MediaOption を struct に変更する - @szktty - [CHANGE] API: ConnectionController: ロールとストリーム種別の選択制限を削除する - @szktty +- [UPDATE] armv7 に対応する + - @szktty - [FIX] API: マルチストリーム時、配信者のストリームが二重に生成されてしまう現象を修正する - @szktty @@ -806,6 +806,14 @@ ## 1.2.0 +- [CHANGE] API: VideoFrame + - ``var width``: ``Int32`` -> ``Int`` + - ``var height``: ``Int32`` -> ``Int`` + - ``var timestamp``: ``CMTime`` -> ``CMTime?`` + - @szktty +- [CHANGE] API: VideoFrameHandle: 次のプロパティ名を変更する + - ``case webRTC`` -> ``case WebRTC`` + - @szktty - [UPDATE] WebRTC M60 に対応する - @szktty - [UPDATE] Bitcode に対応する @@ -834,17 +842,35 @@ - @szktty - [ADD] API: ConnectionController: スナップショットの項目を追加する - @szktty -- [CHANGE] API: VideoFrame - - ``var width``: ``Int32`` -> ``Int`` - - ``var height``: ``Int32`` -> ``Int`` - - ``var timestamp``: ``CMTime`` -> ``CMTime?`` - - @szktty -- [CHANGE] API: VideoFrameHandle: 次のプロパティ名を変更する - - ``case webRTC`` -> ``case WebRTC`` - - @szktty ## 1.1.0 +- [CHANGE] examples を削除 + - @szktty +- [CHANGE] ディレクトリ構造を変更し、プロジェクトのファイルをトップレベルに移動する + - @szktty +- [CHANGE] API: PeerConnection: 接続状態に関わらず WebSocket のイベントハンドラを実行するようにする + - @szktty +- [CHANGE] 次の不要なファイルを削除する + - ``JSON.swift`` + - @szktty +- [CHANGE] API: BuildInfo: 次のプロパティを削除する + - ``var VP9Enabled`` + - @szktty +- [CHANGE] API: Connection: 次のプロパティとメソッドを削除する + - ``var numberOfConnections`` + - ``func onChangeNumberOfConnections(handler:)`` + - @szktty +- [CHANGE] API: ConnectionController: Cancel ボタンを Back ボタンに変更する + - @szktty +- [CHANGE] API: MediaStreamRole: 削除する + - @szktty +- [CHANGE] API: VideoFrame の型を変更する + - ``var width``: ``Int`` -> ``Int32`` + - ``var height``: ``Int`` -> ``Int32`` + - @szktty +- [CHANGE] API: ConnectionController: VP9 の有効・無効を示すセルを削除する + - @szktty - [UPDATE] WebRTC M59 に対応する - @szktty - [ADD] CircleCI を利用する自動ビルドを追加 @@ -879,32 +905,6 @@ - @szktty - [ADD] API: SignalingRole: 追加する - @szktty -- [CHANGE] examples を削除 - - @szktty -- [CHANGE] ディレクトリ構造を変更し、プロジェクトのファイルをトップレベルに移動する - - @szktty -- [CHANGE] API: PeerConnection: 接続状態に関わらず WebSocket のイベントハンドラを実行するようにする - - @szktty -- [CHANGE] 次の不要なファイルを削除する - - ``JSON.swift`` - - @szktty -- [CHANGE] API: BuildInfo: 次のプロパティを削除する - - ``var VP9Enabled`` - - @szktty -- [CHANGE] API: Connection: 次のプロパティとメソッドを削除する - - ``var numberOfConnections`` - - ``func onChangeNumberOfConnections(handler:)`` - - @szktty -- [CHANGE] API: ConnectionController: Cancel ボタンを Back ボタンに変更する - - @szktty -- [CHANGE] API: MediaStreamRole: 削除する - - @szktty -- [CHANGE] API: VideoFrame の型を変更する - - ``var width``: ``Int`` -> ``Int32`` - - ``var height``: ``Int`` -> ``Int32`` - - @szktty -- [CHANGE] API: ConnectionController: VP9 の有効・無効を示すセルを削除する - - @szktty - [FIX] Sora サーバーの URL のプロトコルが ws または wss 以外であればエラーにする - @szktty - [FIX] 接続解除可能な状況でも ``connectionBusy`` のエラーが発生する現象を修正する @@ -928,47 +928,6 @@ ## 1.0.0 -- [UPDATE] WebRTC M57 に対応する - - @szktty -- [UPDATE] API: MediaCapturer: 同一の RTCPeerConnectionFactory で再利用するようにする - - @szktty -- [UPDATE] API: MediaCapturer: 映像トラック名と音声トラック名を自動生成するようにする - - @szktty -- [UPDATE] API: VideoRenderer: 描画処理をメインスレッドで実行するようにする - - @szktty -- [UPDATE] API: VideoView: UI の設計に Nib ファイルを利用するようにする - - @szktty -- [UPDATE] API: VideoView: バックグラウンド (ビューがキーウィンドウに表示されていない) では描画処理を中止するようにする - - @szktty -- [UPDATE] API: VideoView: 映像のアスペクト比を保持するようにする - - @szktty -- [UPDATE] API: MediaConnection: MediaStream を複数保持するようにする - - @szktty -- [ADD] マルチストリームに対応する - - @szktty -- [ADD] シグナリング: "notify" に対応する - - @szktty -- [ADD] API: MediaConnection: ``multistreamEnabled`` プロパティを追加する - - @szktty -- [ADD] API: MediaPublisher: ``autofocusEnabled`` プロパティを追加する - - @szktty -- [ADD] API: PeerConnection: RTCPeerConnection のラッパーとして追加する - - @szktty -- [ADD] API: BuildInfo: 追加する - - @szktty -- [ADD] API: ConnectionController: 追加する - - @szktty -- [ADD] API: Connection: 次の API を追加する - - ``var numberOfConnections`` - - ``func onChangeNumberOfConnections(handler:)`` - - @szktty -- [ADD] API: Connection, MediaConnection, MediaStream, PeerConnection: 次のイベントで (NotificationCenter による) 通知を行うようにする - - onConnect - - onDisconnect - - onFailure - - @szktty -- [ADD] API: WebSocketEventHandlers, SignalingEventHandlers, PeerConnectionEventHandlers: イニシャライザーを追加する - - @szktty - [CHANGE] 対応アーキテクチャを arm64 のみにする - @szktty - [CHANGE] シグナリング: Sora の仕様変更に伴い、 "stats" への対応を廃止する @@ -1012,6 +971,47 @@ - @szktty - [CHANGE] API: StatisticsReport: RTCStatsReport の変更 (名前が RTCLegacyStatsReport に変更された) に伴い削除する - @szktty +- [UPDATE] WebRTC M57 に対応する + - @szktty +- [UPDATE] API: MediaCapturer: 同一の RTCPeerConnectionFactory で再利用するようにする + - @szktty +- [UPDATE] API: MediaCapturer: 映像トラック名と音声トラック名を自動生成するようにする + - @szktty +- [UPDATE] API: VideoRenderer: 描画処理をメインスレッドで実行するようにする + - @szktty +- [UPDATE] API: VideoView: UI の設計に Nib ファイルを利用するようにする + - @szktty +- [UPDATE] API: VideoView: バックグラウンド (ビューがキーウィンドウに表示されていない) では描画処理を中止するようにする + - @szktty +- [UPDATE] API: VideoView: 映像のアスペクト比を保持するようにする + - @szktty +- [UPDATE] API: MediaConnection: MediaStream を複数保持するようにする + - @szktty +- [ADD] マルチストリームに対応する + - @szktty +- [ADD] シグナリング: "notify" に対応する + - @szktty +- [ADD] API: MediaConnection: ``multistreamEnabled`` プロパティを追加する + - @szktty +- [ADD] API: MediaPublisher: ``autofocusEnabled`` プロパティを追加する + - @szktty +- [ADD] API: PeerConnection: RTCPeerConnection のラッパーとして追加する + - @szktty +- [ADD] API: BuildInfo: 追加する + - @szktty +- [ADD] API: ConnectionController: 追加する + - @szktty +- [ADD] API: Connection: 次の API を追加する + - ``var numberOfConnections`` + - ``func onChangeNumberOfConnections(handler:)`` + - @szktty +- [ADD] API: Connection, MediaConnection, MediaStream, PeerConnection: 次のイベントで (NotificationCenter による) 通知を行うようにする + - onConnect + - onDisconnect + - onFailure + - @szktty +- [ADD] API: WebSocketEventHandlers, SignalingEventHandlers, PeerConnectionEventHandlers: イニシャライザーを追加する + - @szktty - [FIX] シグナリング: 音声コーデック Opus を指定するためのパラメーターの間違いを修正する - @szktty - [FIX] 接続解除後にイベントログを記録しようとして落ちる現象を修正する From 1357fb15ea88f3dfdc6f86fcf356776f952ed09d Mon Sep 17 00:00:00 2001 From: enm10k Date: Thu, 30 Jun 2022 12:22:50 +0900 Subject: [PATCH 06/16] =?UTF-8?q?WebRTC=20=E5=81=B4=E3=82=82=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=AD=E3=82=B7=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=99?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 3 +++ Sora/NativePeerChannelFactory.swift | 19 +++++++++++++++---- Sora/PeerChannel.swift | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index 651cbdc4..6f2d3fc4 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -25,6 +25,9 @@ public struct Proxy: CustomStringConvertible { /// プロキシに認証がかかっている場合に指定する var password: String? + /// エージェント + var agent: String = "Sora iOS SDK \(SDKInfo.version)" + public init(host: String, port: Int, username: String? = nil, password: String? = nil) { self.host = host self.port = port diff --git a/Sora/NativePeerChannelFactory.swift b/Sora/NativePeerChannelFactory.swift index 72428295..780c869d 100644 --- a/Sora/NativePeerChannelFactory.swift +++ b/Sora/NativePeerChannelFactory.swift @@ -56,12 +56,23 @@ class NativePeerChannelFactory { func createNativePeerChannel(configuration: WebRTCConfiguration, constraints: MediaConstraints, + proxy: Proxy? = nil, delegate: RTCPeerConnectionDelegate?) -> RTCPeerConnection? { - nativeFactory - .peerConnection(with: configuration.nativeValue, - constraints: constraints.nativeValue, - delegate: delegate) + if let proxy = proxy { + return nativeFactory.peerConnection(with: configuration.nativeValue, + constraints: constraints.nativeValue, + certificateVerifier: nil, + delegate: delegate, + proxyType: RTCProxyType.https, + proxyAgent: proxy.agent, + proxyHostname: proxy.host, + proxyPort: Int32(proxy.port), + proxyUsername: proxy.username ?? "", + proxyPassword: proxy.password ?? "") + } else { + return nativeFactory.peerConnection(with: configuration.nativeValue, constraints: constraints.nativeValue, delegate: delegate) + } } func createNativeStream(streamId: String) -> RTCMediaStream { diff --git a/Sora/PeerChannel.swift b/Sora/PeerChannel.swift index 12d66e8c..95dea654 100644 --- a/Sora/PeerChannel.swift +++ b/Sora/PeerChannel.swift @@ -159,6 +159,7 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate { nativeChannel = NativePeerChannelFactory.default .createNativePeerChannel(configuration: webRTCConfiguration, constraints: webRTCConfiguration.constraints, + proxy: configuration.proxy, delegate: self) guard nativeChannel != nil else { let message = "createNativePeerChannel failed" From c4e4a0613ab3aad581b8dd8dbad64bca08887c94 Mon Sep 17 00:00:00 2001 From: enm10k Date: Thu, 30 Jun 2022 16:01:47 +0900 Subject: [PATCH 07/16] =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=AD=E3=82=B7?= =?UTF-8?q?=E5=88=A9=E7=94=A8=E6=99=82=E3=80=81=20WebSocket=20=E3=81=AB?= =?UTF-8?q?=E3=82=82=20User-Agent=20=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=A7?= =?UTF-8?q?=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 8 ++++++-- Sora/NativePeerChannelFactory.swift | 18 +++++++++--------- Sora/PackageInfo.swift | 1 + Sora/PeerChannel.swift | 4 +--- Sora/URLSessionWebSocketChannel.swift | 2 ++ 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index 6f2d3fc4..b0bbbad2 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -26,9 +26,9 @@ public struct Proxy: CustomStringConvertible { var password: String? /// エージェント - var agent: String = "Sora iOS SDK \(SDKInfo.version)" + var agent: String = SDKInfo.userAgent - public init(host: String, port: Int, username: String? = nil, password: String? = nil) { + public init(host: String, port: Int, agent: String? = nil, username: String? = nil, password: String? = nil) { self.host = host self.port = port @@ -36,6 +36,10 @@ public struct Proxy: CustomStringConvertible { // もしくは、片方のみ設定出来ない API を検討する self.username = username self.password = password + + if let agent = agent { + self.agent = agent + } } public var description: String { diff --git a/Sora/NativePeerChannelFactory.swift b/Sora/NativePeerChannelFactory.swift index 780c869d..471cd498 100644 --- a/Sora/NativePeerChannelFactory.swift +++ b/Sora/NativePeerChannelFactory.swift @@ -61,15 +61,15 @@ class NativePeerChannelFactory { { if let proxy = proxy { return nativeFactory.peerConnection(with: configuration.nativeValue, - constraints: constraints.nativeValue, - certificateVerifier: nil, - delegate: delegate, - proxyType: RTCProxyType.https, - proxyAgent: proxy.agent, - proxyHostname: proxy.host, - proxyPort: Int32(proxy.port), - proxyUsername: proxy.username ?? "", - proxyPassword: proxy.password ?? "") + constraints: constraints.nativeValue, + certificateVerifier: nil, + delegate: delegate, + proxyType: RTCProxyType.https, + proxyAgent: proxy.agent, + proxyHostname: proxy.host, + proxyPort: Int32(proxy.port), + proxyUsername: proxy.username ?? "", + proxyPassword: proxy.password ?? "") } else { return nativeFactory.peerConnection(with: configuration.nativeValue, constraints: constraints.nativeValue, delegate: delegate) } diff --git a/Sora/PackageInfo.swift b/Sora/PackageInfo.swift index 1e62d763..bda009bf 100644 --- a/Sora/PackageInfo.swift +++ b/Sora/PackageInfo.swift @@ -2,6 +2,7 @@ public enum SDKInfo { // Sora iOS SDK のバージョンを定義する public static let version = "2022.3.0" + public static let userAgent = "Sora iOS SDK \(version)" } /** diff --git a/Sora/PeerChannel.swift b/Sora/PeerChannel.swift index 95dea654..a11c75ff 100644 --- a/Sora/PeerChannel.swift +++ b/Sora/PeerChannel.swift @@ -285,8 +285,6 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate { multistream = true } - let soraClient = "Sora iOS SDK \(SDKInfo.version)" - let webRTCVersion = "Shiguredo-build \(WebRTCInfo.version) (\(WebRTCInfo.version).\(WebRTCInfo.commitPosition).\(WebRTCInfo.maintenanceVersion) \(WebRTCInfo.shortRevision))" let simulcast = configuration.simulcastEnabled || configuration.spotlightEnabled == .enabled @@ -310,7 +308,7 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate { spotlightUnfocusRid: configuration.spotlightUnfocusRid, simulcastEnabled: simulcast, simulcastRid: configuration.simulcastRid, - soraClient: soraClient, + soraClient: SDKInfo.userAgent, webRTCVersion: webRTCVersion, environment: DeviceInfo.current.description, dataChannelSignaling: configuration.dataChannelSignaling, diff --git a/Sora/URLSessionWebSocketChannel.swift b/Sora/URLSessionWebSocketChannel.swift index 5cd2f5cd..82ff4ade 100644 --- a/Sora/URLSessionWebSocketChannel.swift +++ b/Sora/URLSessionWebSocketChannel.swift @@ -25,8 +25,10 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe func connect(delegateQueue: OperationQueue?) { let configuration = URLSessionConfiguration.ephemeral + configuration.httpAdditionalHeaders = ["User-Agent": SDKInfo.userAgent] if let proxy = proxy { + configuration.httpAdditionalHeaders?["User-Agent"] = proxy.agent configuration.connectionProxyDictionary = [ kCFNetworkProxiesHTTPProxy: proxy.host, kCFNetworkProxiesHTTPPort: proxy.port, From cc452311f9a68d502e1d4bf36e69cdf15198ea64 Mon Sep 17 00:00:00 2001 From: enm10k Date: Thu, 30 Jun 2022 17:00:39 +0900 Subject: [PATCH 08/16] =?UTF-8?q?Revert=20"=E3=83=97=E3=83=AD=E3=82=AD?= =?UTF-8?q?=E3=82=B7=E5=88=A9=E7=94=A8=E6=99=82=E3=80=81=20WebSocket=20?= =?UTF-8?q?=E3=81=AB=E3=82=82=20User-Agent=20=E3=82=92=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit c4e4a0613ab3aad581b8dd8dbad64bca08887c94. --- Sora/Configuration.swift | 8 ++------ Sora/NativePeerChannelFactory.swift | 18 +++++++++--------- Sora/PackageInfo.swift | 1 - Sora/PeerChannel.swift | 4 +++- Sora/URLSessionWebSocketChannel.swift | 2 -- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index b0bbbad2..6f2d3fc4 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -26,9 +26,9 @@ public struct Proxy: CustomStringConvertible { var password: String? /// エージェント - var agent: String = SDKInfo.userAgent + var agent: String = "Sora iOS SDK \(SDKInfo.version)" - public init(host: String, port: Int, agent: String? = nil, username: String? = nil, password: String? = nil) { + public init(host: String, port: Int, username: String? = nil, password: String? = nil) { self.host = host self.port = port @@ -36,10 +36,6 @@ public struct Proxy: CustomStringConvertible { // もしくは、片方のみ設定出来ない API を検討する self.username = username self.password = password - - if let agent = agent { - self.agent = agent - } } public var description: String { diff --git a/Sora/NativePeerChannelFactory.swift b/Sora/NativePeerChannelFactory.swift index 471cd498..780c869d 100644 --- a/Sora/NativePeerChannelFactory.swift +++ b/Sora/NativePeerChannelFactory.swift @@ -61,15 +61,15 @@ class NativePeerChannelFactory { { if let proxy = proxy { return nativeFactory.peerConnection(with: configuration.nativeValue, - constraints: constraints.nativeValue, - certificateVerifier: nil, - delegate: delegate, - proxyType: RTCProxyType.https, - proxyAgent: proxy.agent, - proxyHostname: proxy.host, - proxyPort: Int32(proxy.port), - proxyUsername: proxy.username ?? "", - proxyPassword: proxy.password ?? "") + constraints: constraints.nativeValue, + certificateVerifier: nil, + delegate: delegate, + proxyType: RTCProxyType.https, + proxyAgent: proxy.agent, + proxyHostname: proxy.host, + proxyPort: Int32(proxy.port), + proxyUsername: proxy.username ?? "", + proxyPassword: proxy.password ?? "") } else { return nativeFactory.peerConnection(with: configuration.nativeValue, constraints: constraints.nativeValue, delegate: delegate) } diff --git a/Sora/PackageInfo.swift b/Sora/PackageInfo.swift index bda009bf..1e62d763 100644 --- a/Sora/PackageInfo.swift +++ b/Sora/PackageInfo.swift @@ -2,7 +2,6 @@ public enum SDKInfo { // Sora iOS SDK のバージョンを定義する public static let version = "2022.3.0" - public static let userAgent = "Sora iOS SDK \(version)" } /** diff --git a/Sora/PeerChannel.swift b/Sora/PeerChannel.swift index a11c75ff..95dea654 100644 --- a/Sora/PeerChannel.swift +++ b/Sora/PeerChannel.swift @@ -285,6 +285,8 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate { multistream = true } + let soraClient = "Sora iOS SDK \(SDKInfo.version)" + let webRTCVersion = "Shiguredo-build \(WebRTCInfo.version) (\(WebRTCInfo.version).\(WebRTCInfo.commitPosition).\(WebRTCInfo.maintenanceVersion) \(WebRTCInfo.shortRevision))" let simulcast = configuration.simulcastEnabled || configuration.spotlightEnabled == .enabled @@ -308,7 +310,7 @@ class PeerChannel: NSObject, RTCPeerConnectionDelegate { spotlightUnfocusRid: configuration.spotlightUnfocusRid, simulcastEnabled: simulcast, simulcastRid: configuration.simulcastRid, - soraClient: SDKInfo.userAgent, + soraClient: soraClient, webRTCVersion: webRTCVersion, environment: DeviceInfo.current.description, dataChannelSignaling: configuration.dataChannelSignaling, diff --git a/Sora/URLSessionWebSocketChannel.swift b/Sora/URLSessionWebSocketChannel.swift index 82ff4ade..5cd2f5cd 100644 --- a/Sora/URLSessionWebSocketChannel.swift +++ b/Sora/URLSessionWebSocketChannel.swift @@ -25,10 +25,8 @@ class URLSessionWebSocketChannel: NSObject, URLSessionDelegate, URLSessionTaskDe func connect(delegateQueue: OperationQueue?) { let configuration = URLSessionConfiguration.ephemeral - configuration.httpAdditionalHeaders = ["User-Agent": SDKInfo.userAgent] if let proxy = proxy { - configuration.httpAdditionalHeaders?["User-Agent"] = proxy.agent configuration.connectionProxyDictionary = [ kCFNetworkProxiesHTTPProxy: proxy.host, kCFNetworkProxiesHTTPPort: proxy.port, From 84e555e630ae8e62f72715352420ea27089335ce Mon Sep 17 00:00:00 2001 From: enm10k Date: Thu, 30 Jun 2022 17:09:18 +0900 Subject: [PATCH 09/16] =?UTF-8?q?struct=20Proxy=20=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 16 ++++++++++------ Sora/NativePeerChannelFactory.swift | 18 +++++++++--------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index 6f2d3fc4..4cc79eb9 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -12,23 +12,23 @@ private let defaultPublisherAudioTrackId: String = "mainAudio" */ public struct Proxy: CustomStringConvertible { /// プロキシのホスト - var host: String + let host: String /// ポート - var port: Int + let port: Int /// username /// プロキシに認証がかかっている場合に指定する - var username: String? + let username: String? /// password /// プロキシに認証がかかっている場合に指定する - var password: String? + let password: String? /// エージェント var agent: String = "Sora iOS SDK \(SDKInfo.version)" - public init(host: String, port: Int, username: String? = nil, password: String? = nil) { + public init(host: String, port: Int, agent: String? = nil, username: String? = nil, password: String? = nil) { self.host = host self.port = port @@ -36,10 +36,14 @@ public struct Proxy: CustomStringConvertible { // もしくは、片方のみ設定出来ない API を検討する self.username = username self.password = password + + if let agent = agent { + self.agent = agent + } } public var description: String { - "host=\(host) port=\(port) username=\(username ?? "") password=\(String(repeating: "*", count: password?.count ?? 0))" + "host=\(host) port=\(port) agent=\(agent) username=\(username ?? "") password=\(String(repeating: "*", count: password?.count ?? 0))" } } diff --git a/Sora/NativePeerChannelFactory.swift b/Sora/NativePeerChannelFactory.swift index 780c869d..471cd498 100644 --- a/Sora/NativePeerChannelFactory.swift +++ b/Sora/NativePeerChannelFactory.swift @@ -61,15 +61,15 @@ class NativePeerChannelFactory { { if let proxy = proxy { return nativeFactory.peerConnection(with: configuration.nativeValue, - constraints: constraints.nativeValue, - certificateVerifier: nil, - delegate: delegate, - proxyType: RTCProxyType.https, - proxyAgent: proxy.agent, - proxyHostname: proxy.host, - proxyPort: Int32(proxy.port), - proxyUsername: proxy.username ?? "", - proxyPassword: proxy.password ?? "") + constraints: constraints.nativeValue, + certificateVerifier: nil, + delegate: delegate, + proxyType: RTCProxyType.https, + proxyAgent: proxy.agent, + proxyHostname: proxy.host, + proxyPort: Int32(proxy.port), + proxyUsername: proxy.username ?? "", + proxyPassword: proxy.password ?? "") } else { return nativeFactory.peerConnection(with: configuration.nativeValue, constraints: constraints.nativeValue, delegate: delegate) } From e90156e16986d3070fc570b6a27f32049c3d5a15 Mon Sep 17 00:00:00 2001 From: miosakuma Date: Tue, 5 Jul 2022 09:59:51 +0900 Subject: [PATCH 10/16] =?UTF-8?q?README=20=E3=81=AE=20libwebrtc=20?= =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=81=8C=E5=A3=8A=E3=82=8C=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=81=9F=E3=81=9F=E3=82=81=E4=BF=AE=E6=AD=A3=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4dc3f590..944ffeae 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Sora iOS SDK -[![libwebrtc](https://img.shields.io/badge/libwebrtc-103.5060-blue.svg)](https://chromium.googlesource.com/external/webrtc/+/branch-heads/5060 +[![libwebrtc](https://img.shields.io/badge/libwebrtc-103.5060-blue.svg)](https://chromium.googlesource.com/external/webrtc/+/branch-heads/5060) [![GitHub tag](https://img.shields.io/github/tag/shiguredo/sora-ios-sdk.svg)](https://github.com/shiguredo/sora-ios-sdk) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) @@ -24,7 +24,7 @@ Please read https://github.com/shiguredo/oss before use. - Xcode 13.4 - Swift 5.6.1 - CocoaPods 1.11.2 以降 -- WebRTC SFU Sora 2022.1 以降 +- WebRTC SFU Sora 2022.1.0 以降 Xcode と Swift のバージョンによっては、 CocoaPods で取得できるバイナリに互換性がない可能性があります。詳しくはドキュメントを参照してください。 From 59389fd51ad1ce546df542729cf80dcf832a158f Mon Sep 17 00:00:00 2001 From: miosakuma Date: Tue, 5 Jul 2022 10:50:28 +0900 Subject: [PATCH 11/16] Sora 2022.1 -> Sora 2022.1.0 --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 828c1472..9718f8ac 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -21,7 +21,7 @@ - @enm10k - [UPDATE] システム条件を変更する - macOS 12.3 以降 - - WebRTC SFU Sora 2022.1 以降 + - WebRTC SFU Sora 2022.1.0 以降 - @miosakuma - [UPDATE] WebRTC 103.5060.4.0 に上げる - @miosakuma From 14e8316a2d932c34c31a474c369a27a32c206438 Mon Sep 17 00:00:00 2001 From: miosakuma Date: Fri, 29 Jul 2022 15:01:34 +0900 Subject: [PATCH 12/16] =?UTF-8?q?WebRTC=20104.5112.8.0=20=E3=81=AB?= =?UTF-8?q?=E4=B8=8A=E3=81=92=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 3 +++ Package.swift | 4 ++-- Podfile | 2 +- Podfile.dev | 2 +- Sora.podspec | 2 +- Sora/PackageInfo.swift | 6 +++--- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 9718f8ac..f9c2e643 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,9 @@ ## develop +- [UPDATE] WebRTC 104.5112.8.0 に上げる + - @miosakuma + ## 2022.4.0 - [CHANGE] mid を必須にする diff --git a/Package.swift b/Package.swift index 7fd67cdc..d48dc27d 100644 --- a/Package.swift +++ b/Package.swift @@ -3,7 +3,7 @@ import Foundation import PackageDescription -let file = "WebRTC-103.5060.4.0/WebRTC.xcframework.zip" +let file = "WebRTC-104.5112.8.0/WebRTC.xcframework.zip" let package = Package( name: "Sora", @@ -16,7 +16,7 @@ let package = Package( .binaryTarget( name: "WebRTC", url: "https://github.com/shiguredo/sora-ios-sdk-specs/releases/download/\(file)", - checksum: "237dcac806176bf46db759b8dd2b9d39542ad71414dd07c26a492cdeae91fd19" + checksum: "ec6feb3bcfd778bd7164d2de518eeaa1dfa0d1b721540985662fb7565c8b3223" ), .target( name: "Sora", diff --git a/Podfile b/Podfile index d831fb11..9e8db5d7 100644 --- a/Podfile +++ b/Podfile @@ -5,5 +5,5 @@ platform :ios, '13.0' target 'Sora' do use_frameworks! - pod 'WebRTC', '103.5060.4.0' + pod 'WebRTC', '104.5112.8.0' end diff --git a/Podfile.dev b/Podfile.dev index dc996938..b5204303 100644 --- a/Podfile.dev +++ b/Podfile.dev @@ -5,7 +5,7 @@ platform :ios, '13.0' target 'Sora' do use_frameworks! - pod 'WebRTC', '103.5060.4.0' + pod 'WebRTC', '104.5112.8.0' pod 'SwiftLint', '0.45.1' pod 'SwiftFormat/CLI', '0.49.0' end diff --git a/Sora.podspec b/Sora.podspec index 8be16221..6f782d7e 100644 --- a/Sora.podspec +++ b/Sora.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| } s.source_files = "Sora/**/*.swift" s.resources = ['Sora/*.xib'] - s.dependency "WebRTC", '103.5060.4.0' + s.dependency "WebRTC", '104.5112.8.0' s.pod_target_xcconfig = { 'ARCHS' => 'arm64', 'ARCHS[config=Debug]' => '$(ARCHS_STANDARD)' diff --git a/Sora/PackageInfo.swift b/Sora/PackageInfo.swift index 0e08c915..892c8a00 100644 --- a/Sora/PackageInfo.swift +++ b/Sora/PackageInfo.swift @@ -9,16 +9,16 @@ public enum SDKInfo { */ public enum WebRTCInfo { /// WebRTC フレームワークのバージョン - public static let version = "M103" + public static let version = "M104" /// WebRTC フレームワークのコミットポジション - public static let commitPosition = "4" + public static let commitPosition = "8" /// WebRTC フレームワークのメンテナンスバージョン public static let maintenanceVersion = "0" /// WebRTC フレームワークのソースコードのリビジョン - public static let revision = "cd3ae79bce5516336481fd0a689499601b57d1bc" + public static let revision = "06aea31d10f860ae4236e3422252557762d39188" /// WebRTC フレームワークのソースコードのリビジョン (短縮版) public static var shortRevision: String { From ba4576045fd50fed10c39866744b0fc307559d8e Mon Sep 17 00:00:00 2001 From: miosakuma Date: Fri, 29 Jul 2022 16:04:52 +0900 Subject: [PATCH 13/16] =?UTF-8?q?TODO=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index 4cc79eb9..6e7bba73 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -32,8 +32,6 @@ public struct Proxy: CustomStringConvertible { self.host = host self.port = port - // TODO: username と password の片方が設定された場合、エラーにする? - // もしくは、片方のみ設定出来ない API を検討する self.username = username self.password = password From 505652019d291f13b138daa4886c7c8699346d6f Mon Sep 17 00:00:00 2001 From: miosakuma Date: Fri, 29 Jul 2022 16:06:26 +0900 Subject: [PATCH 14/16] =?UTF-8?q?=E5=A4=89=E6=9B=B4=E5=B1=A5=E6=AD=B4?= =?UTF-8?q?=E3=82=92=E6=9B=B4=E6=96=B0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index b0f92472..5b30ea69 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,9 @@ ## develop +- [ADD] HTTP プロキシに対応する + - @enm10k + ## 2022.3.0 - [UPDATE] システム条件を変更する From 2f673558e06f1966f07cce3b5d7c6c51fbf1e4b5 Mon Sep 17 00:00:00 2001 From: miosakuma Date: Wed, 3 Aug 2022 16:39:39 +0900 Subject: [PATCH 15/16] =?UTF-8?q?API=20=E3=83=89=E3=82=AD=E3=83=A5?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=88=E5=90=91=E3=81=91=E3=81=AE=E3=82=B3?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/Configuration.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Sora/Configuration.swift b/Sora/Configuration.swift index a8c7b5b6..be2da7c8 100644 --- a/Sora/Configuration.swift +++ b/Sora/Configuration.swift @@ -28,6 +28,14 @@ public struct Proxy: CustomStringConvertible { /// エージェント var agent: String = "Sora iOS SDK \(SDKInfo.version)" + /** + 初期化します。 + - parameter host: プロキシのホスト名 + - parameter port: プロキシのポート + - parameter agent: プロキシのエージェント + - parameter username: プロキシ認証に使用するユーザー名 + - parameter password: プロキシ認証に使用するパスワード + */ public init(host: String, port: Int, agent: String? = nil, username: String? = nil, password: String? = nil) { self.host = host self.port = port @@ -40,6 +48,7 @@ public struct Proxy: CustomStringConvertible { } } + /// 文字列表現を返します。 public var description: String { "host=\(host) port=\(port) agent=\(agent) username=\(username ?? "") password=\(String(repeating: "*", count: password?.count ?? 0))" } From 9d4e8ab30f399e3aba65d2f9b41562701f55ac1b Mon Sep 17 00:00:00 2001 From: miosakuma Date: Thu, 4 Aug 2022 13:53:48 +0900 Subject: [PATCH 16/16] =?UTF-8?q?2022.5.0=20=E3=83=AA=E3=83=AA=E3=83=BC?= =?UTF-8?q?=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .jazzy.yaml | 2 +- CHANGES.md | 2 ++ README.md | 6 +++--- Sora.podspec | 2 +- Sora.xcodeproj/project.pbxproj | 4 ++-- Sora/PackageInfo.swift | 2 +- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.jazzy.yaml b/.jazzy.yaml index 76020705..85500a53 100644 --- a/.jazzy.yaml +++ b/.jazzy.yaml @@ -8,7 +8,7 @@ theme: apple min_acl: public sdk: iphoneos module: Sora -module_version: 2022.4.0 +module_version: 2022.5.0 swift_version: 5.6.1 xcodebuild_arguments: - -parallelizeTargets diff --git a/CHANGES.md b/CHANGES.md index 87fe4a33..68681216 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,8 @@ ## develop +## 2022.5.0 + - [UPDATE] WebRTC 104.5112.8.0 に上げる - @miosakuma - [ADD] HTTP プロキシに対応する diff --git a/README.md b/README.md index 944ffeae..6acbc164 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Sora iOS SDK -[![libwebrtc](https://img.shields.io/badge/libwebrtc-103.5060-blue.svg)](https://chromium.googlesource.com/external/webrtc/+/branch-heads/5060) +[![libwebrtc](https://img.shields.io/badge/libwebrtc-104.5112-blue.svg)](https://chromium.googlesource.com/external/webrtc/+/branch-heads/5112) [![GitHub tag](https://img.shields.io/github/tag/shiguredo/sora-ios-sdk.svg)](https://github.com/shiguredo/sora-ios-sdk) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) @@ -21,10 +21,10 @@ Please read https://github.com/shiguredo/oss before use. - iOS 13 以降 - アーキテクチャ arm64, x86_64 (シミュレーターの動作は未保証) - macOS 12.3 以降 -- Xcode 13.4 +- Xcode 13.4.1 - Swift 5.6.1 - CocoaPods 1.11.2 以降 -- WebRTC SFU Sora 2022.1.0 以降 +- WebRTC SFU Sora 2022.1.1 以降 Xcode と Swift のバージョンによっては、 CocoaPods で取得できるバイナリに互換性がない可能性があります。詳しくはドキュメントを参照してください。 diff --git a/Sora.podspec b/Sora.podspec index 6f782d7e..b57be5bf 100644 --- a/Sora.podspec +++ b/Sora.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Sora" - s.version = "2022.4.0" + s.version = "2022.5.0" s.summary = "Sora iOS SDK" s.description = <<-DESC A library to develop Sora client applications. diff --git a/Sora.xcodeproj/project.pbxproj b/Sora.xcodeproj/project.pbxproj index d5d15f05..5e3ab60d 100644 --- a/Sora.xcodeproj/project.pbxproj +++ b/Sora.xcodeproj/project.pbxproj @@ -592,7 +592,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 2022.4.0; + MARKETING_VERSION = 2022.5.0; PRODUCT_BUNDLE_IDENTIFIER = jp.shiguredo.sora.ios.sdk.Sora; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -625,7 +625,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MARKETING_VERSION = 2022.4.0; + MARKETING_VERSION = 2022.5.0; PRODUCT_BUNDLE_IDENTIFIER = jp.shiguredo.sora.ios.sdk.Sora; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; diff --git a/Sora/PackageInfo.swift b/Sora/PackageInfo.swift index 892c8a00..1279d50e 100644 --- a/Sora/PackageInfo.swift +++ b/Sora/PackageInfo.swift @@ -1,7 +1,7 @@ /// :nodoc: public enum SDKInfo { // Sora iOS SDK のバージョンを定義する - public static let version = "2022.4.0" + public static let version = "2022.5.0" } /**