PQSRTC is a cross-platform real-time communications (RTC) core designed for Apple platforms (Swift) and Android (Kotlin) via Skip.
It provides WebRTC session orchestration, call state/state-machine helpers, and optional frame-level end-to-end encryption (E2EE) primitives.
- Apple: iOS 18+, macOS 15+ (via Swift Package Manager)
- Android: via Skip transpilation (Swift → Kotlin)
Add this package to your app via Swift Package Manager (Xcode: File → Add Packages…) and import PQSRTC.
At the core is RTCSession, which requires your app to provide a transport delegate for exchanging offers/answers/ICE with your signaling layer.
import PQSRTC
let transport: RTCTransportEvents = /* your transport implementation */
let session = RTCSession(
iceServers: ["stun:stun.l.google.com:19302"],
username: "",
password: "",
delegate: transport
)For multiparty, use RTCGroupCall (SFU-style) instead of building N×(N-1) peer connections.
swift build
swift testInstall Skip with Homebrew:
brew install skiptools/skip/skipSkip will install the required prerequisites (Kotlin/Gradle/Android tooling) and can run parity tests:
skip android testswift testruns the compiled Swift test suite on macOS.skip android testcan run cross-platform parity testing (Swift + transpiled Kotlin/JUnit).
- Group calls (SFU): Sources/PQSRTC/PQSRTC.docc/Articles/Group-Calls.md
- Connecting to servers: Sources/PQSRTC/PQSRTC.docc/Articles/Connecting-to-Servers.md
- DocC: see Sources/PQSRTC/PQSRTC.docc
If you see a sender-side stall where video capture continues but outbound RTP stops, double-check H264
profile-level-id negotiation. RTCSession.modifySDP(...) intentionally caps Constrained Baseline
from level 5.2 (42e034) down to level 4.0 (42e028). Do not change this to level 3.1 (42e01f)
for 1080p sources, as it can cause encoder/sender stalls.
MIT. See LICENSE.