This documentation is for reference only. We are no longer onboarding new customers to Programmable Video. Existing customers can continue to use the product until December 5, 2026.
We recommend migrating your application to the API provided by our preferred video partner, Zoom. We've prepared this migration guide to assist you in minimizing any service disruption.
The Twilio Programmable Video SDKs use Semantic Versioning. Twilio supports version N-1 for 12 months after the first GA release of version N. We recommend you upgrade to the latest version as soon as possible to avoid any breaking changes. Version 3.x is the latest Video iOS version.
Support for 2.x will cease on October 4th, 2020. This branch will only receive fixes for critical issues until that date. Check this guide when planning your migration to 3.x.
Support for iOS SDK version 1.x ended on April 26, 2019.
The Twilio Programmable Video SDKs use Semantic Versioning.
API Changes
TVIErrorParticipantSessionLengthExceededError
(53216) is added to support configurable participant session limit.
Bug Fixes
Known Issues
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 10.0 MB | 21.4 MB |
arm64 | 4.8 MB | 11.3 MB |
armv7 | 5.2 MB | 10.1 MB |
Enhancements
API Changes
Known Issues
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 10.0 MB | 21.4 MB |
arm64 | 4.8 MB | 11.3 MB |
armv7 | 5.2 MB | 10.1 MB |
Bug Fixes
Known Issues
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 10.0 MB | 21.4 MB |
arm64 | 4.8 MB | 11.3 MB |
armv7 | 5.2 MB | 10.1 MB |
This release adds support for Apple Silicon arm64 Macs, updates WebRTC and modernizes our use of several WebRTC APIs. Thank you for your feedback on 4.6.0-beta1 and for your interest in Apple Silicon development.
Features
TwilioVideo.xcframework
now supports the simulator on Apple Silicon arm64 Macs. #144
Enhancements
Room.getStats()
by adopting the W3C standardized RTC stats API
API Changes
RemoteParticipantDelegate.onAudioTrackSubscribed()
and
RemoteParticipantDelegate.onVideoTrackSubscribed()
is not strictly guaranteed. In this release the ordering of these callbacks may be different when compared to previous releases.
LocalVideoTrackStats.framesEncoded
now reflects the total number of frames encoded for a simulcast track.
Bug Fixes
Room.getStats()
where block callbacks could sometimes be significantly delayed. [CSDK-3475]
twilio-video.js
when publishing media in Peer-to-Peer or WebRTC Go Rooms.
#931
Known Issues
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 10.0 MB | 21.4 MB |
arm64 | 4.8 MB | 11.3 MB |
armv7 | 5.2 MB | 10.1 MB |
This release contains a significant update to the Bandwidth Profile API. It allows for more efficient use of bandwidth and CPU in multi-party applications. In addition it provides developers with more dynamic control over which video tracks are delivered to the client and the preferred video resolution of the tracks. These capabilities are provided via the Client Track Switch Off Control and Video Content Preferences settings.
Existing Bandwidth Profile settings will continue to function as before, however we recommend developers update their Bandwidth Profile settings to make use of these new capabilities at their earliest convenience.
RemoteVideoTrack
is received or not. Client Track Switch Off Control has two modes of operation:
RemoteVideoTrack.switchOff()
/
switchOn()
methods.
maxTracks
property to limit the number of tracks visible, you should migrate to using
clientTrackSwitchOffControl
to take advantage of this feature.
RemoteVideoTrack
. Video content preferences has two modes of operation:
RemoteVideoTrack
rendered by a
VideoView
with larger dimensions will get a higher quality video compared to a
RemoteVideoTrack
rendered by a
VideoView
with smaller dimensions.
RemoteVideoTrack.setContentPreferences()
.
renderDimensions
property, you should migrate to using
contentPreferencesMode
to take advantage of this feature.
Both of these features are available in Group Rooms and are enabled by default if your application specifies BandwidthProfileOptions during connect.
1let connectOptions = ConnectOptions(token: accessToken) { (builder) in2builder.bandwidthProfileOptions = BandwidthProfileOptions(3videoOptions: VideoBandwidthProfileOptions { builder in4// Use "auto" default. Be sure to remove "maxTracks" and "renderDimensions".5}6)7}89let room = TwilioVideoSDK.connect(options: connectOptions, delegate: self)
If you don't want the SDK to automatically switch on/off RemoteVideoTracks
then specify ClientTrackSwitchOffControl.manual
and VideoContentPreferencesMode.manual
instead.
1let connectOptions = ConnectOptions(token: accessToken) { (builder) in2builder.bandwidthProfileOptions = BandwidthProfileOptions(3videoOptions: VideoBandwidthProfileOptions { builder in4builder.clientTrackSwitchOffControl = .manual5builder.contentPreferencesMode = .manual6}7)8}910let room = TwilioVideoSDK.connect(options: connectOptions, delegate: self)
Participants that connect with ClientTrackSwitchOffControl.manual
can request which RemoteVideoTracks
are switched on or off.
1func didSubscribeToVideoTrack(videoTrack: RemoteVideoTrack,2publication: RemoteVideoTrackPublication,3participant: RemoteParticipant) {4if participant.identity != "Bob" {5videoTrack.switchOff()6}7}
Subscribers that connect with VideoContentPreferencesMode.manual
can request which resolution they prefer to receive RemoteVideoTracks
in.
1func didSubscribeToVideoTrack(videoTrack: RemoteVideoTrack,2publication: RemoteVideoTrackPublication,3participant: RemoteParticipant) {4videoTrack.setContentPreferences(VideoContentPreferences { builder in5builder.renderDimensions = VideoDimensions(width: 320, height: 240)6})7}
VideoBandwidthProfileOptions.maxTracks
property is now deprecated and will raise a warning when set. Calling
RemoteVideoTrack.switchOn()
or
RemoteVideoTrack.switchOff()
after setting
maxTracks
is not allowed and will raise an exception.
VideoBandwidthProfileOptions.renderDimensions
property is now deprecated and will raise a warning when set. Calling
RemoteVideoTrack.setContentPreferences()
after setting
renderDimensions
is not allowed and will raise an exception.
Room
was not available right after the
RoomDelegate.roomDidConnect(room:)
delegate was invoked. [VIDEO-4616]
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Enhancements
RoomDelegate.participantDidConnect()
delegate method is invoked when a
RemoteParticipant
connects to the Room and publishes at least one Track.
RoomDelegate.participantDidDisconnect()
delegate method is invoked when a
RemoteParticipant
disconnects from the Room or unpublishes all of its Tracks.
RemoteParticipant
unpublishes all of its tracks (resulting in the
RoomDelegate.participantDidDisconnect()
delegate method being invoked) and later republishes a track, a new
RemoteParticipant
object will be provided in the subsequent
RoomDelegate.participantDidConnect()
delegate method invocation with the same Participant Sid as before.
ParticipantMaxTracksExceededError
unless one or more published Tracks is unpublished.
Bug Fixes
onNetworksChanged
callback while network monitor was being destroyed.
Known Issues
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 9.7 MB | 20.7 MB |
arm64 | 4.7 MB | 11.0 MB |
armv7 | 5.0 MB | 9.7 MB |
API Changes
CameraSource.Error.cameraPermissionDenied
Bug Fixes
CameraSouce.startCapture()
now properly raises the
CameraSource.Error.cameraPermissionDenied
error when attempting to start capturing the camera when a user has declined the camera permissions.
Known Issues
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 9.6 MB | 20.4 MB |
arm64 | 4.6 MB | 10.9 MB |
armv7 | 4.9 MB | 9.5 MB |
Enhancements
API Changes
VideoTrack.addRenderer()
multiple times with the same
VideoRenderer
now throws a helpful
NSInvalidArgumentException
instead of firing
NSAssert
.
Known Issues
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
Universal | 9.6 MB | 20.4 MB |
arm64 | 4.6 MB | 10.9 MB |
armv7 | 4.9 MB | 9.5 MB |
Enhancements
VideoView
is not supported.
Bug Fixes
Known Issues
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
LocalAudioTrack
or
LocalVideoTrack
might not be seen by Participants.
#34
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.6 MB | 10.8 MB |
Bug Fixes
Distribution Changes
Acknowledgements.md
since Poco is no longer a dependency
Known Issues
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.6 MB | 10.8 MB |
Enhancements
.xcframework
. The
.xcframework
package includes the
.dSYM
and
.bcsymbolmap
files to allow developers to symbolicate crash reports.
Room
using
AppScreenSource
. The Video SDK uses ReplayKit internally for in-app screen capture.
AppScreenSource
conforms to
VideoSource
and uses
RPScreenRecorder
to capture video of your app's screen. Here is a brief example:
1if let source = AppScreenSource(), let track = LocalVideoTrack(source: source) {2room.localParticipant?.publishVideoTrack(track)3source.startCapture()4}
TVIOpusCodec
class now has a new initializer
[TVIOpusCodec initWithDtxEnabled:]
and a property
dtxEnabled
.
TVIParticipantState
enumeration.
TVIParticipant.state
property.
[TVIRoomDelegate room:participantIsReconnecting:]
and
[TVIRoomDelegte room:participantDidReconnect:]
to
TVIRoomDelegate
. These callbacks will be raised when a
TVIRemoteParticipant
is attempting to reconnect to a room due to a signaling network interruption. NOTE: It can take up to 15 seconds for our signaling backend to detect that a RemoteParticipant's connection has been disrupted due to a network degradation or handoff.
isRecording
property in
TVIRoom
now accurately reflects the current recording state of the
TVIRoom
. In the previous versions of the SDK,
isRecording
could return false positives. In
TVIRoomDelegate
the
roomDidStartRecording
and
roomDidStopRecording
callbacks will now be invoked when recording for at least a single track in the
TVIRoom
has begun and ended respectively.
API Updates
AppScreenSource
to control video capture of your app's screen.
TVIRemoteParticipant.connected
property in favor of
TVIParticipant.state
.
Removed the following deprecated APIs
VideoView.RenderingType
[VideoView initWithFrame:delegate:renderingType:renderingType]
abortOnIceServersTimeout
and
iceServersTimeout
properties from
IceOptions
and
IceOptionsBuilder
.
Distribution Changes
Known Issues
TwilioVideo.xcframework
does not currently support the simulator on Apple Silicon arm64 Macs.
.xcframeworks
as documented
here
. Once Carthage supports binary
.xcframeworks
, Carthage distribution will be re-added.
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIRoom
.
Size Impact
Architecture | Compressed Size | Uncompressed Size |
---|---|---|
arm64 | 4.6 MB | 10.8 MB |