A WebRTC module for React Native.
| Android | iOS | tvOS | macOS* | Windows* | Web* | Expo* | |
|---|---|---|---|---|---|---|---|
| Audio/Video | ✔️ | ✔️ | ✔️ | - | - | ✔️ | ✔️ |
| Data Channels | ✔️ | ✔️ | - | - | - | ✔️ | ✔️ |
| Screen Capture | ✔️ | ✔️ | - | - | - | ✔️ | ✔️ |
| Plan B | - | - | - | - | - | - | - |
| Unified Plan* | ✔️ | ✔️ | - | - | - | ✔️ | ✔️ |
| Simulcast* | ✔️ | ✔️ | - | - | - | ✔️ | ✔️ |
macOS - We don't currently actively support macOS at this time.
Support might return in the future.
Windows - We don't currently support the react-native-windows platform at this time.
Anyone interested in getting the ball rolling? We're open to contributions.
Web - The react-native-webrtc-web-shim project provides a shim for react-native-web support.
Which will allow you to use (almost) the exact same code in your react-native-web project as you would with react-native directly.
Expo - As this module includes native code it is not available in the Expo Go app by default.
However you can get things working via the expo-dev-client library and out-of-tree config-plugins/react-native-webrtc package.
Unified Plan - As of version 106.0.0 Unified Plan is the only supported mode.
Those still in need of Plan B will need to use an older release.
Simulcast - As of version 111.0.0 Simulcast is now possible with ease.
Software encode/decode factories have been enabled by default.
- Currently used revision: M124 (Fishjam fork)
- iOS dependency:
FishjamWebRTC— Fishjam's custom WebRTC build with thedefer mic permissionpatch (replacesJitsiWebRTC). - Supported architectures
- Android: armeabi-v7a, arm64-v8a, x86, x86_64
- iOS: arm64, x86_64
- tvOS: arm64
- macOS: arm64, x86_64
The iOS side ships against FishjamWebRTC — a CocoaPods pod published from fishjam-cloud/webrtc that wraps a prebuilt WebRTC.xcframework. Source patches live on the fishjam-m124 branch; the podspec and release tooling live on master.
Cut a new FishjamWebRTC version when any of the following happens:
- A new patch lands on
fishjam-m124that we need on the client (e.g. anotheraudio_device_ios.mmchange, a fix to the network interfaces path, a privacy-manifest update). - We rebase
fishjam-m124onto a newer jitsi/webrtc tag (e.g. moving fromv124.0.2tov124.0.3). - A security advisory in upstream WebRTC requires picking up a fix.
You do not need to cut a new FishjamWebRTC for changes that only touch this RN wrapper (ios/**.{h,m,swift}, JS sources). Those ship as a normal @fishjam-cloud/react-native-webrtc npm bump.
<upstream-version>.<fishjam-patch-N>, e.g. 124.0.2.1.
- First three parts = the jitsi upstream version the build is patched on top of.
- Fourth part = Fishjam patch counter against that base, starts at
1, increments per release. - On upstream rebase (e.g. jitsi ships
124.0.3), reset counter: next release is124.0.3.1. - Pin with
~> 124.0.2.0to accept any Fishjam patch on top of jitsi124.0.2, or pin exact.
Full runbook (build, tag, GH release, trunk publish, smoke test) lives in fishjam-cloud/webrtc's RELEASING.md on the master branch. TL;DR:
- On a macOS build host with
depot_tools+ afetch webrtc_ioscheckout, switch the gclientsrc/tofishjam-m124, rungclient sync, thentools_webrtc/ios/build_ios_libs.py --build_config release --arch device:arm64 simulator:arm64 simulator:x64. - Validate the patch is in the built binary:
strings WebRTC.xcframework/*/WebRTC.framework/WebRTC | grep -c "<unique-string-from-patch>"— every slice must have a non-zero count. (Release builds strip C++ symbols, so usestrings, notnm.) - Zip the xcframework as
FishjamWebRTC.xcframework.zip, tagvX.Y.Z.Nonfishjam-m124, push, andgh release createwith the zip attached. - On
master: bumps.versioninios/FishjamWebRTC.podspecto match, commit, push. pod trunk push ios/FishjamWebRTC.podspec --allow-warnings(one-timepod trunk registerper identity).
Inside this repo:
- Bump the dependency in
FishjamReactNativeWebrtc.podspec:s.dependency 'FishjamWebRTC', '~> X.Y.Z.0'(or pin exact if needed). - Bump
versioninpackage.json— minor bump if the underlying WebRTC change is user-observable, patch otherwise. - Test with
cd ios && pod installin a consuming app and exercise the affected behavior end-to-end.
Use one of the following preferred package install methods to immediately get going.
Don't forget to follow platform guides below to cover any extra required steps.
npm: npm install react-native-webrtc --save
yarn: yarn add react-native-webrtc
pnpm: pnpm install react-native-webrtc
- Android Install
- iOS Install
- tvOS Install
- Basic Usage
- Step by Step Call Guide
- Improving Call Reliability
- Migrating to Unified Plan
We have some very basic example projects included in the examples directory.
Don't worry, there are plans to include a much more broader example with backend included.
Come join our Discourse Community if you want to discuss any React Native and WebRTC related topics.
Everyone is welcome and every little helps.
Looking for extra functionality coverage?
The react-native-webrtc organization provides a number of packages which are more than useful when developing Real Time Communication applications.