
To build a Swift video chat app in 2026, pick the call topology first (peer-to-peer for 1:1, an SFU for groups), then choose between prebuilt Swift video calling components from an SDK such as Stream, LiveKit or Agora and raw WebRTC behind your own Swift 6 actors. Render video in SwiftUI, wire CallKit and PushKit for incoming calls, and test on real devices — the Simulator has no camera. Swift 6 strict concurrency is what keeps signalling, media capture, on-device AI and UI updates from racing each other: the bugs that used to be “I thought this ran on main” crashes become compile errors.
This is the practical build guide we use at Fora Soft to ship video chat on iOS in 2026: WebRTC vs SFU vs MCU architecture, Swift 6 concurrency patterns that survive production load, iOS 26 Liquid Glass and iOS 27 notes, on-device AI for noise suppression and backgrounds, and a concrete estimate for a v1 launch. If you are scoping a SwiftUI video chat app with our video chat app development team or replacing a legacy Agora/Twilio wrapper with a native Swift 6 stack, start here.
Key takeaways
• Swift 6 kills video chat’s worst class of concurrency bugs. Signaller-UI state desync, media-thread writes to UI state, and races between the media and signalling threads move from intermittent runtime crashes to compile errors once WebRTC callbacks sit behind actors. Audio-video drift is a clock problem, not a data race — that one still needs RTCP discipline.
• SFU is the default architecture for most apps. Self-hosted WebRTC SFU (mediasoup, Janus, LiveKit) gives you cost control and the ability to add AI processing hooks. Peer-to-peer is a 1:1 optimization; MCU only if every client is bandwidth-starved.
• On-device AI is the feature delta that users actually notice. On-device noise suppression, background replacement and iOS 26 on-device transcription (SpeechAnalyzer) deliver perceptible quality wins without a cloud round-trip.
• SwiftUI is production-ready for the video chat UI. Host the MTKView or AVSampleBufferDisplayLayer inside a UIViewRepresentable, keep the chrome in SwiftUI, and use @Observable for state.
• A v1 ships in 14–20 weeks. With Agent Engineering and a focused senior team a two-platform (iOS + web) v1 with SFU, E2E tests, and App Store submission typically lands 20–40% below the hours a conventional agency would quote.
Updated October 2026: Swift 6.4 and iOS 27 (shipped September 2026), a Swift video calling SDK comparison with current Twilio and Agora prices, and a step-by-step build path.
Why Fora Soft wrote this playbook
Fora Soft has built video conferencing and streaming software since 2005 — 250+ projects delivered by 50+ in-house specialists. Our engineers ship WebRTC, HLS, and SIP stacks under commercial pressure for e-health platforms, EdTech, media, and enterprise video clients. Recent production work includes the video stack behind VALT, a video surveillance platform used by 770+ US organizations, the iOS client for BrainCert’s learning platform, and a custom SIP integration documented in our SIP video conferencing integration playbook.
We migrated our iOS video clients to Swift 6 through 2024–2025. Every concurrency pattern, WebRTC binding, and AI-processing hook below is one we have run in production. Agent Engineering (senior engineers supervising Cursor/Claude/Copilot) keeps our video chat estimates 20–40% below typical agency rates without loosening review depth — especially valuable when a RTCPeerConnection binding needs to pass strict concurrency checking.
Building or replacing a video chat iOS app?
Tell us whether you are greenfield or migrating from Agora/Twilio/Zoom SDK. We’ll come back with a staged plan, architecture options, and a tight estimate — typically well below a rewrite-everything quote.
How to build a Swift video chat app: the short path
A Swift video chat app takes eight steps, whether you use prebuilt SwiftUI video chat components or raw WebRTC. In SwiftUI the short version is: join a room through an SDK or your own WebRTC engine, show each participant’s video in a UIViewRepresentable tile, and bind mute, camera and hang-up buttons to an @Observable call model. A basic 1:1 video chat app starts from about $6,000 and 6–8 weeks with our team; group calls, AI features and a web client add to that. The order matters more than the framework: teams that pick an SDK before they know their group size and call volume usually migrate a year later.
1. Pick the topology. Peer-to-peer for 1:1 calls, an SFU for group calls, an MCU only for very low-bandwidth or legacy-SIP endpoints (details in the next sections).
2. Choose components or raw WebRTC. A Swift video calling SDK gives you a ready call screen in days; raw WebRTC (the Stasel XCFramework) gives you control of the media path and no per-minute fee. The comparison table below shows the 2026 options.
3. Add the package with Swift Package Manager and build with Xcode 26 or later: since April 28, 2026 Apple only accepts App Store uploads built with the iOS 26 SDK (Apple, 2026).
4. Declare permissions. Add NSCameraUsageDescription and NSMicrophoneUsageDescription to Info.plist (the app crashes on first camera access without them), plus the audio and voip background modes.
5. Stand up signalling and tokens. A small server issues room tokens and relays SDP and ICE; never ship SDK secrets inside the app binary.
6. Render calls in SwiftUI. Wrap the video surface in UIViewRepresentable, keep call controls in SwiftUI, and drive state from an @Observable view model on @MainActor.
7. Wire CallKit and PushKit so incoming calls ring on a locked phone like a native call.
8. Test on real devices and ship. The Simulator has no camera; test two or three physical iPhones on Wi-Fi and LTE, then submit with a privacy manifest.
Why Swift 6 is the right baseline for a video chat app
Swift 6 iOS development pays off for video chat specifically because it turns the app’s worst class of bugs — cross-thread races between the media, signalling and UI pipelines — into compile-time errors instead of 2 a.m. production crashes. Here’s why that matters.
A video chat app runs multiple real-time pipelines at once: signalling WebSocket, media capture, WebRTC peer connection, encoder, decoder, renderer, UI, and (increasingly) on-device AI. Every one of those ran historically on a different DispatchQueue, and the bugs that bite you in production are the cross-queue hand-offs no one documented.
With Swift 6 you model each of those pipelines as an actor; the compiler enforces Sendable boundaries at compile time, and uses region-based isolation so you do not drown in annotations. The result is a codebase where “what thread is this on?” becomes a property of the type, not a comment in the header. For anyone who has debugged a mid-call black screen caused by a media-thread write to a UI variable, this is the entire point.
As of October 2026 we build new video chat clients with Swift 6.4, which ships with Xcode 27 (September 2026), and accept Swift 6.2 (September 2025) as the floor. Two Swift 6.4 additions help call teardown directly: await is now allowed inside defer, and withTaskCancellationShield lets the hang-up path finish closing the peer connection even after the call task is cancelled. For the language deep-dive see our Swift 6 Explained article; if you just need to add calls to an existing app, our WebRTC in iOS how-to is the faster read. This is the applied, Swift 6 concurrency version for video chat.
Reference architecture — the iOS client stack
A modern Swift 6 video chat client sits on four horizontal layers. Each layer maps cleanly to one or two actors, and the boundaries between them are the only places non-Sendable values cross. New to the moving parts? Our real-time video streaming fundamentals in Learn cover the transport basics this stack assumes.

Figure 1. The four-layer client stack. Each layer is owned by one or two Swift 6 actors; values cross only as Sendable snapshots.
1. Signalling layer
URLSessionWebSocketTask wrapped in a Signaller actor. Inbound messages flow through AsyncStream; outbound sending payloads. Typed throws for protocol-level errors.
2. Media layer
WebRTC bindings (Stasel’s WebRTC XCFramework via Swift Package Manager) wrapped in a MediaEngine actor. The engine owns the RTCPeerConnection, audio/video tracks, codec preferences, and stats collection. AVCaptureSession runs behind a dedicated capture actor to isolate the camera/microphone.
3. AI processing layer (optional but increasingly standard)
Noise suppression, voice isolation, background replacement, real-time captioning, speaker diarization. Runs on the Neural Engine via Core ML or Apple Intelligence. Wrapped in a MediaFX actor that consumes buffers from the capture actor via sending.
4. UI layer
SwiftUI with @Observable view models on @MainActor. Video render views are UIViewRepresentable wrappers around MTKView or AVSampleBufferDisplayLayer. Presence, grid, and call controls are pure SwiftUI. Persistence — call history, a message store, an offline signalling queue — goes through SwiftData, kept off the media path; anything an actor also touches crosses as a Sendable snapshot.
SFU vs peer-to-peer vs MCU — pick the architecture first
Pick an SFU for group calls, peer-to-peer for 1:1, and an MCU only for low-bandwidth or legacy-SIP clients. Architecture choice beats framework choice, and the options map cleanly to use cases. If you want a second opinion before committing, our custom WebRTC architecture engineers review topology and media-server choice as a separate engagement.
| Architecture | Best for | Max practical size | Uplink cost | Server cost | AI hooks |
|---|---|---|---|---|---|
| Peer-to-peer | 1:1 calls, friends-and-family | 2 | Low | TURN only | Client-side only |
| SFU (Selective Forwarding Unit) | Group meetings, webinars, EdTech | 25–50 visible, 1000+ listening | 1× per client | Medium | Server + client |
| MCU (Multipoint Control Unit) | Low-bandwidth clients, legacy SIP | 30–80 | 1× upstream only | High (transcoding) | Server-side |
| Managed SDK (Agora, Twilio, etc.) | Prototype speed, low engineering | Depends | Varies | Usage-priced | Limited |
Reach for a self-hosted SFU when: your product does group meetings, you expect to grow past roughly 100,000 call minutes a month, and you want to add server-side AI (transcription, diarization, moderation) without paying a managed SDK a per-minute tax.

Figure 2. Three topologies, three cost curves. P2P for 1:1, SFU for groups, MCU for low-bandwidth or legacy SIP.
Swift video calling SDKs and components compared (2026)
The fastest way to a working Swift video chat app is a managed SDK with prebuilt SwiftUI components; the cheapest way at scale is raw WebRTC with your own SFU. Most products start on the first and move to the second once SDK fees pass roughly $20,000 a year — the point where savings cover the extra engineering. Prices below are list prices we checked on each vendor’s pricing page in October 2026.
| Option | What you get in Swift | Price (as of October 2026) | Pick it when |
|---|---|---|---|
| Stream Video (StreamVideoSwiftUI) | Prebuilt SwiftUI video calling components: full call screen, ringing, screen share, PiP, customizable via ViewFactory |
Usage-priced; check vendor page | You want a polished call UI in days |
| LiveKit Swift SDK | Open-source client SDK and SFU; self-host or LiveKit Cloud | Free self-hosted; Cloud usage-priced | You want to own the SFU later without rewriting the app |
| Agora Video SDK | Client SDK with its own global network; UI kit available | $3.99 per 1,000 HD minutes after 10,000 free a month (Agora, 2026) | Your users are spread across regions with poor networks |
| Twilio Programmable Video | Client SDK, group rooms, recordings | $0.004 per participant-minute (Twilio, 2026) | You already run Twilio voice or messaging |
| Zoom Video SDK | Zoom media stack via SPM, delegate-based API | Plan-based; check vendor page | Your users already trust Zoom quality |
| Raw WebRTC (Stasel XCFramework) | Peer connection only; you build every component | Free; you pay for SFU, TURN and bandwidth | Volume is high, or you need the media stream for AI |
Whatever you pick, keep the SDK behind your own MediaEngine actor. Then the switch from managed components to a self-hosted SFU is a change in one module, not a rewrite of the call screen.
Concurrency model — actors, sending, and the media thread
The actor map below is what we ship. Every arrow is a sending or Sendable boundary enforced at compile time.
actor Signaller // WebSocket I/O, JSON parsing
actor MediaEngine // RTCPeerConnection, transports
actor CaptureSession // AVCaptureSession, microphone, camera
actor MediaFX // Core ML noise suppression, background
@MainActor class CallViewModel { ... } // SwiftUI state
// Example: capture -> FX -> media
extension MediaFX {
func process(_ buffer: sending CVPixelBuffer) async -> sending CVPixelBuffer {
// Neural Engine inference; returns new buffer
}
}
The trick that makes this work at 30 fps on a 5-year-old device: the MediaFX and CaptureSession actors have their own unowned Executor pinned to a high-priority DispatchQueue, so the compiler treats them as actors but the runtime keeps them on the media thread. Without custom executors, the default actor thread pool can introduce frame jitter.

Figure 3. The media path, race-free by construction. Every hand-off is a Swift 6 sending boundary the compiler verifies.
iOS 26 Liquid Glass — design notes for video chat UI
iOS 26’s Liquid Glass introduces translucent layers across core chrome. For video chat UI that means two concrete changes: call controls need to read legibly against a live-video background (contrast math matters), and the Control Center / Camera / Messaging integration hooks (Genmoji, Live Translation) land through Apple Intelligence APIs rather than custom code.
Plan a design audit before shipping against iOS 26: verify every control survives WCAG AA against your three worst call backgrounds (dark room, sunlit window, bright screen share), and replace any hand-rolled translucent chrome with the native Liquid Glass materials so behaviour is consistent across system updates.
iOS 27 shipped on September 14, 2026 and keeps the Liquid Glass design language, so a call UI built on the native materials for iOS 26 carries over with little rework — the migration tax is highest for apps still hand-rolling translucency.
Reach for Liquid Glass native materials when: your app targets iOS 26 and later. For apps still serving iOS 17/18 audiences, keep a parallel opaque-chrome theme to avoid legibility regressions on older systems.
On-device AI features that move retention
Four AI features consistently move video-chat retention in our experience. All four ship on iOS with first-party or well-supported frameworks.
1. Noise suppression and voice isolation. Apple’s AVFoundation Voice Processing is the baseline. For more aggressive cleanup, integrate RNNoise or a Core ML port; run on the Neural Engine. Skip client-side AI only when you have a server-side pipeline you fully trust.
2. Background replacement. Vision Person Segmentation gives a clean alpha mask. Composite over a static image or blur in a Metal shader. Resolution: 540p is enough for a 1080p final frame; full-res segmentation burns battery.
3. Live captioning and translation. On iOS 26 and later, Apple’s on-device SpeechAnalyzer API transcribes call audio without a server round-trip, which is our default for in-call captions; feed it the remote participant’s incoming WebRTC audio track, not only the local microphone, and pair it with Apple’s on-device Translation framework for translated captions. Apple’s own Live Translation reaches third-party VoIP apps only through CallKit: in 2025 an Apple engineer confirmed that toggling it with CXSetTranslatingCallAction is the only control you get (Apple Developer Forums, 2025). For users on older iOS, fall back to Whisper via Core ML or a server-side pipeline.
4. Speaker diarization. NVIDIA Streaming Sortformer (server-side) or an on-device embedding-and-cluster pipeline. Useful for meetings > 2 people where “who said what” is part of the output. When these features need to run on the phone itself, our on-device AI mobile app development team ships them on Core ML and Apple Foundation Models.
Reach for on-device AI when: the feature is per-frame or per-utterance, latency under 50 ms matters, or users expect privacy. Anything heavier (meeting summaries, long-form search) still belongs server-side.
Need on-device AI glued into your video chat app?
Noise suppression, background replacement, live captions — we have integrated all of them on production iOS video apps. Send us the one you want first; we’ll come back with effort, risks, and a demo plan.
WebRTC binding patterns for Swift 6
The WebRTC framework on iOS is Objective-C, and there’s a supply-chain wrinkle worth knowing before you add a dependency: Google stopped publishing official iOS binaries after Chromium milestone M80 in 2020, so the old GoogleWebRTC CocoaPod is stale. In 2026 the community standard is Stasel’s WebRTC distribution — pre-built XCFrameworks per Chromium milestone, compiled from official source and shipped through Swift Package Manager; the M152 build landed in September 2026. Getting that clean under Swift 6 strict concurrency then takes three concrete moves.
1. Wrap all RTC objects behind an actor. Never expose RTCPeerConnection or RTCRtpSender to your UI layer. Your MediaEngine actor owns them; the UI layer only sees Sendable snapshots.
2. Convert delegate callbacks to AsyncStream. The RTC framework fires delegate events on its own thread. Wrap each delegate in an AsyncStream continuation and consume it from a task on the MediaEngine actor.
3. Use @unchecked Sendable sparingly and document every use. Some RTC types are internally thread-safe but not declared Sendable. One @unchecked per wrapper type with a one-sentence justification is the ceiling; more than that and you are lying to the compiler.
Reach for @unchecked Sendable when: the wrapped type is thread-safe by contract (documented in its upstream source) but not annotated. Never as a quick escape from a real race.
Performance and battery budget
A production video chat iOS app needs to land inside a real battery budget. Treat <8% drain per 10-minute 1:1 call on a mid-range device as the ceiling, and <12% on a 4-person SFU call; a well-tuned 1:1 call should sit closer to 5%. Cross the ceiling and users notice and churn.
The levers that move the needle most: keep camera capture at 720p unless the user explicitly asks for 1080p, run AI inference on the Neural Engine (not CPU), avoid main-thread re-renders by splitting your @Observable view models, and always prefer hardware codecs (H.264/H.265 via VideoToolbox) over software AV1.

Figure 4. The battery budget. Target drain per 10-minute call and the four levers that keep you inside it.
SwiftUI integration without surprises
SwiftUI is the right UI choice for a new video chat app. The pattern that ships reliably: @Observable view model on @MainActor, subscribed to the MediaEngine actor’s Sendable state snapshots. Render views are UIViewRepresentable wrappers around MTKView/AVSampleBufferDisplayLayer.
For the full comparison of when to pick SwiftUI vs UIKit for video apps, see our SwiftUI Video Conferencing vs UIKit guide. The short version: SwiftUI for 95% of the UI, UIViewRepresentable for the video surface, UIKit only when you need a very custom input or gesture behaviour.
Testing a real-time video chat app without flake
Video chat apps are famously hard to test. Our stack: Swift Testing for unit and fast-integration, XCUITest for single-device UI flows, BrowserStack Real Device Cloud for multi-device call scenarios (now with Playwright-on-iOS-Safari support as covered in our Summer 2025 digest), and an in-house rig that spins up two or three simulators in parallel with scripted mic/camera feeds for automated runs — real iPhones are still required for camera and network checks.
For AI QA at scale, we integrate Reflect Mobile or Zentester against the main call flow. The combination of Swift Testing’s parameterized tests plus AI-driven UI regression cuts our manual QA cycle by 60–80% on video chat releases.
Cost math — what a Swift 6 video chat v1 looks like
1. Discovery & architecture (2–3 weeks). Architecture choice (SFU vs managed SDK), device matrix, call-flow spec, security and compliance scope (E2EE, HIPAA). Output: a tight SOW.
2. Signalling + SFU backend (4–6 weeks). Node/Go signalling service, self-hosted SFU (mediasoup or LiveKit), TURN servers on Hetzner/AWS, operational dashboards.
3. iOS client (6–8 weeks, parallel). Swift 6 actor architecture, WebRTC bindings, SwiftUI UI, call controls, grid/presence, on-device AI (noise + background) in v1.
4. Web client (4–6 weeks, parallel if needed). React/TypeScript with native WebRTC APIs, shared signalling protocol with iOS.
5. QA, device-matrix testing, App Store submission (3–4 weeks). Multi-device call tests, E2E flows, store assets, internal pilot.
The build-vs-buy number. In our 2026 deployments one self-hosted SFU server plus TURN and bandwidth costs about $300–$500 a month and covers you from launch to low-thousands of concurrent streams (Hetzner raised dedicated-server prices from April 1, 2026, so re-quote hardware before you sign). Managed SDKs bill per participant: a 30-minute 1:1 call is 60 billable minutes. At $0.004 per participant-minute (Twilio, 2026) or $3.99 per 1,000 HD minutes (Agora, 2026), SDK fees overtake that raw infrastructure cost at roughly 75,000–150,000 participant-minutes a month (Figure 5). Add the engineering and operations of running your own media server, and self-hosting usually pays off once SDK fees reach about $20,000 a year — which is exactly when our EdTech and enterprise clients migrate.
Total. An iOS + web video chat v1 with self-hosted SFU typically lands in 14–20 weeks of elapsed time with a focused senior team. Agent Engineering usually brings us to the low end. For honest numbers on your scope, book a scoping call.

Figure 5. Where the numbers cross. Managed-SDK per-minute pricing overtakes fixed SFU infra as call volume grows.
Mini case — EdTech live-class iOS client on Swift 6
Situation. A client running a global online-learning platform needed the iOS client for their live-class product rebuilt. The legacy client used Objective-C, Agora SDK, and a maze of GCD callbacks. Concurrency-class crashes accounted for a material share of their App Store crash reports. Goal: Swift 6 native, self-hosted SFU, no Agora dependency, no regression on teacher-student latency.
12-week plan. Weeks 1–3: architecture review, SFU selection (mediasoup), signalling protocol spec, new actor model on paper. Weeks 4–8: iOS client rebuild — Signaller, MediaEngine, CaptureSession, MediaFX actors with strict concurrency from day one. Weeks 9–10: SwiftUI call UI, grid, hand-raise, presence; Swift Testing unit suite; XCUITest integration. Weeks 11–12: multi-device QA (two teachers, 30 students), App Store submission, phased rollout.
Outcome. Concurrency-class crashes dropped sharply in the first post-migration release. Teacher-to-student end-to-end latency stayed inside the old KPI band. The client eliminated per-minute Agora fees by shifting to a self-hosted SFU, recovering the migration investment inside two quarters of operation.
A decision framework — choose your Swift 6 video chat stack in five questions
1. Group size? 1:1 means peer-to-peer. Groups of 3–50 visible means SFU. Low-bandwidth or legacy SIP endpoints means MCU.
2. Build or buy the media server? If call volume is low or you are pre-PMF, start on a managed SDK and migrate later. If you will exceed roughly $20k/year in SDK fees, a self-hosted SFU pays off.
3. On-device AI requirements? Noise suppression and background replacement are table stakes. Live captions/translation matter in EdTech and enterprise. Diarization matters for meeting tools.
4. Compliance scope? HIPAA, GDPR, SOC 2, E2EE — decide before the architecture. It drives SFU choice, key management, and logging.
5. Cross-platform plan? If you need iOS, Android, and web, plan a shared signalling protocol and KMP or Swift-on-Android for business logic. iOS-only apps can go deeper into native performance.
Pitfalls to avoid
1. Treating actors as “drop-in replacements for GCD queues.” Actors have their own ordering and priority semantics. A straight lift-and-shift from GCD introduces subtle latency bugs. Design the actor map explicitly.
2. Shipping without a stats pipeline. RTCPeerConnection stats are your only window into “why is this call bad?” Log them from day one, visualise them in your dashboards, and alert on regressions.
3. Over-rendering on main thread. SwiftUI re-renders aggressively under @Observable. Profile with Instruments; split view models so only the grid re-renders when the speaker changes, not the whole screen.
4. Ignoring CallKit integration. If your product offers PSTN, push-to-call, or system-level call integration, CallKit is non-optional. Budget two sprints for a clean integration.
5. Underestimating store review and Privacy Manifests. Video chat apps face extra App Store scrutiny (privacy, minors, content moderation), and Apple now requires a PrivacyInfo.xcprivacy manifest declaring both the data your app collects (camera and microphone feeds) and its required-reason API use (file timestamps, user defaults, system boot time) for your app and every third-party SDK — the WebRTC binary included. Write your App Privacy report, the privacy manifest, and your content-moderation story before you submit, not after. Since April 28, 2026 the build itself must also come from Xcode 26 or later with the iOS 26 SDK.
KPIs — what to measure on a live video chat app
Quality KPIs. End-to-end audio latency (target <200 ms), video jitter (target <30 ms), packet loss sustained above 1%, frames dropped per session (target <1%), and MOS (mean opinion score) from in-call surveys.
Business KPIs. Minutes per session, sessions per active user per week, call completion rate (calls that reach >60 s), and funnel-to-paid conversion for apps with a subscription layer.
Reliability KPIs. Crash-free session rate (target ≥99.5%), call-drop rate (reconnects that fail), cold-start time (target ≤1.5 s on mid-range), and median time-to-first-frame on entering a call.
When not to build a Swift 6 native video chat app
Not every product should own a native video chat stack. Lean on a managed SDK (Agora, Twilio, Zoom SDK, LiveKit Cloud) if you are pre-product-market-fit, your SDK fees stay under roughly $20k a year, or video chat is a supporting feature rather than the product spine.
The Swift 6 native path makes sense once you are past PMF, paying more than roughly $20k a year in SDK fees, or blocked from shipping AI features because your SDK does not expose the media stream. Many of our clients come to us exactly at that inflection point — we scope the migration so existing traffic keeps running on the managed SDK while the native stack takes over channel by channel.
Time to escape Agora or Twilio pricing?
We have helped EdTech, e-health, and enterprise clients migrate from managed SDKs to Swift 6 + self-hosted SFU. Send us your call volume and timeline; we will come back with a phased migration plan and ROI estimate.
FAQ
What is the best SDK for a Swift video chat app?
For the fastest launch, Stream Video gives the most complete prebuilt SwiftUI video calling components; LiveKit is the best pick if you plan to self-host the SFU later; Agora and Twilio suit teams already on their networks. At high call volume, raw WebRTC with your own SFU is cheapest.
Can I build a SwiftUI video chat app without an SDK?
Yes. Add the WebRTC XCFramework through Swift Package Manager, run your own signalling server and an SFU such as mediasoup or LiveKit, and render video in SwiftUI through a UIViewRepresentable wrapper. Expect more engineering time up front and no per-minute fees.
How long does it take to build a Swift video chat app?
With prebuilt SDK components, a working 1:1 call screen takes days and a store-ready app a few weeks. An iOS + web v1 on a self-hosted SFU takes 14–20 weeks with a small senior team.
Is Swift 6 production-ready for video chat apps?
Yes. We have migrated production iOS video clients to Swift 6 through 2024–2025 and build new ones on Swift 6.4 (Xcode 27, September 2026). The migration needs planning (see our staged approach), but the end state is safer and easier to maintain than Swift 5 with complete checking.
Should we use WebRTC directly or a managed SDK?
Managed SDK if you are pre-PMF or call volume is low. Native WebRTC + self-hosted SFU once SDK fees become material, compliance demands visibility into the media stream, or you need to add AI processing the SDK does not expose.
Which SFU should we pick?
Mediasoup and LiveKit are our defaults. Mediasoup for teams comfortable with a lower-level Node/C++ stack; LiveKit for faster time-to-value and built-in SDKs. Janus stays a solid choice when SIP interop or recording pipelines are central. Final choice depends on your language, ops preferences, and feature set.
How do we handle CallKit and PSTN?
CallKit is mandatory for native-feeling incoming calls on iOS. Pair it with PushKit VoIP notifications for reliable wake-up. For PSTN dial-in/dial-out, Twilio or a direct SIP gateway bridges into your SFU via an SFU-side SIP worker.
Can we support end-to-end encryption?
Yes — on iOS via a WebRTC build that exposes frame encryption (for example the frame cryptor in the WebRTC build behind LiveKit’s Swift SDK), with Insertable Streams the equivalent on the web client. The SFU still routes packets but cannot decrypt them. Budget additional engineering for key management, mid-call key rotation, and clear UX around the encryption state.
How much does a self-hosted SFU cost to run?
On Hetzner dedicated bare-metal (AX-series) a well-tuned mediasoup or LiveKit server handles hundreds to low-thousands of concurrent streams per box. For most small-to-midsize products, total monthly infrastructure cost (SFU + TURN + bandwidth) stays well under managed SDK alternatives once traffic is non-trivial.
How much does it cost to build a Swift 6 video chat app?
Most of the cost is senior engineering time. An iOS + web v1 with a self-hosted SFU is typically 14–20 weeks of a small senior team; with Agent Engineering that usually lands 20–40% below a conventional agency quote for the same scope. A basic 1:1 video chat app starts from about $6,000. Running cost is separate: a self-hosted SFU starts around $300–$500/month, and self-hosting usually pays off once managed-SDK fees pass about $20,000 a year. Send us your scope for a firm number.
How do you test video chat without flaky automation?
Swift Testing for unit and fast-integration; XCUITest for single-device flows; a multi-simulator rig with scripted mic/camera feeds for call scenarios; AI QA tools (Reflect Mobile, Zentester) for end-to-end regression; and BrowserStack real-device tests for hardware-specific bugs.
What does a Fora Soft engagement look like for video chat?
We typically start with a 2–3 week discovery sprint (architecture decision, SFU choice, SOW), then staff a senior-led team for the build. Agent Engineering — senior engineers pairing with AI coding tools under full review — keeps those estimates well below conventional agency rates. For ongoing scale, we pair with clients as a dedicated development team.
What to read next
Language
Swift 6 Explained
Concurrency, Sendable, sending, typed throws and Swift Testing — the language layer under this guide.
iOS
WebRTC in iOS (2026)
Add video calls to an existing iOS app: Swift, CallKit, SFU and the cost basics.
UI
SwiftUI vs UIKit for Video Conferencing
Performance guide — when SwiftUI wins and when UIKit still earns its keep.
Tooling
Swift Package Manager for Video Apps
Module layout and Sendable-safe package boundaries for a real video client.
Interop
SIP Integration for Video Conferencing
When you need PSTN or legacy SIP endpoints to meet your WebRTC SFU.
Ready to ship a Swift 6 video chat app with confidence?
Swift 6 iOS development takes the two hardest things about shipping a video chat app — concurrency safety and media-thread discipline — and makes them compile-time properties of your code. Pair that with a self-hosted SFU, on-device AI, and a SwiftUI UI, and you have a product stack that is cheaper to run, easier to reason about, and faster to extend than a managed-SDK shortcut.
If you are replacing an Agora/Twilio wrapper, planning a greenfield EdTech or telehealth product, or adding on-device AI to a legacy video client, the patterns above are the ones we use every day. When you want engineers who have already shipped this architecture in production, we are a 30-minute call away.
The book · Volume 3 of 7
Video Streaming: A Complete Guide to Video Delivery: From ABR and CDNs to Players, WebRTC, DRM, and the Economics of Streaming
The Swift 6 client is only half of a video chat app; the other half is how media travels between peers and through the SFU. This volume covers that side: WebRTC and real-time delivery, adaptive bitrate for weak networks, player recovery after stalls and QoE monitoring, which is what iOS engineers need when a call looks fine in the simulator and breaks on LTE. Written by Nikolay Sapunov, CEO at Fora Soft.
Read it on Amazon →Kindle & paperback · Fora Soft Video Engineering Handbook
Bring us your Swift 6 video chat scope
Tell us your call volume, target devices, and compliance scope. We’ll return a staged plan, defendable estimate, and the two architecture bets you should make first.