iOS Core SDK
Breaking changes
- Plugins are no longer provided by the server. They must now be declared upfront on the client side by passing a
pluginslist toRtkMeetingInfo. Any plugin not declared at initialization will not be available in the meeting.let meetingInfo = RtkMeetingInfo( authToken: authToken, plugins: [ RtkClientPluginConfig( id: "whiteboard", // Must match the plugin ID used on Web for sync to work name: "Whiteboard", url: "https://example.com", icon: "https://example.com/logo.png", permissions: RtkClientPluginPermissions(canActivate: true, canDeactivate: false) ) ] ) - Several internal properties have been removed from
RtkPlugin:baseURL,config,description,isPrivate, andstaggered. Use the newiconandpermissionsproperties instead. baseUrlinRtkMeetingInfonow has a default value and no longer needs to be passed explicitly.- The two-argument
subscribe(key:listener:)andunsubscribe(key:listener:)overloads onRtkStorethat passed both the key and value to the callback have been removed. Use the single-argument callback variants introduced in 2.1.0.
Features
- AI Transcription — A new
RtkAiclass (exposed asclient.ai) provides access to real-time transcripts. ImplementRtkAiEventListenerand register it withaddAiEventListener(_:)to receiveonTranscript(data:)callbacks. AtranscriptionEnabledpermission is available onMiscellaneousPermissions. - Connected Meetings (Breakout Rooms) — A new
RtkConnectedMeetingsclass (exposed asclient.connectedMeetings) enables breakout room workflows. Register anRtkConnectedMeetingsEventListenerto handle room transitions and state updates. See the Breakout Rooms documentation for a full guide. - Chat: Edit and Delete — Messages can now be edited and deleted. New methods on
RtkChat:editTextMessage(messageId:newText:onResult:),editImageMessage(messageId:newUri:onResult:),editFileMessage(messageId:newUri:onResult:), anddeleteMessage(messageId:onResult:).RtkChatEventListenergainsonMessageEdited(message:)andonMessageDeleted(messageId:)callbacks.ChatMessagenow includes anisEditedflag. - Chat: Fetch and Pagination — New methods on
RtkChat—fetchPublicMessages(beforeTimestamp:count:onlyPinned:onResult:),fetchPrivateMessages(userId:beforeTimestamp:count:onlyPinned:onResult:),fetchPinnedMessages(beforeTimestamp:count:onlyPinned:onResult:), andgetMessages(timestamp:count:channelId:isPinned:onResult:)— allow fetching historical messages with cursor-based pagination viaFetchMessagesResult(messages:hasMore:). - Client-Declared Plugins — Plugins are now configured entirely on the client via
RtkClientPluginConfigandRtkClientPluginPermissions.RtkPluginexposes the newiconandpermissionsproperties accordingly. - Targeted Broadcast Messages —
RtkParticipants.broadcastMessage(message:targetParticipantIds:payload:)sends a message to a specific subset of participants. - Nullable Store Values —
RtkStore.set(key:value:broadcast:persist:)now accepts a nullablevalue: Any?, allowing keys to be cleared by setting them tonil. - Logging Control —
RealtimeKitClientgainsenableLogging(_:)andenableLogging(_:minSeverity:)to control SDK log output at runtime. - Result_ Utility Type — A new
Result_<S, F>type withSuccessandFailurevariants is used consistently across new async APIs. It is namedResult_to avoid collision with Swift's built-inResulttype.
Fixes
- Improved reconnection handling to ensure media recovers gracefully in more scenarios
- Fixed potential UI hangs by dispatching audio route change observer off the main thread
- Improved simulcast tiers to broadcast at a wider range of qualities on higher tiers
- Fixed some races in media handling causing mute/unmute operations to rarely result in a crash
- Optimized API calls in the room join flow to speed up first join durations
- Fixed file and image uploads in chat failing under some conditions
Breaking changes
RtkParticipants.activeSpeaker→RtkParticipants.lastActiveSpeaker. The oldactiveSpeakerproperty is deprecated and will be removed in a future release.RtkSelfParticipant.enableScreenShare()→enableScreenShare(onResult:). The old no-callback version is deprecated and will be removed in a future release.RtkSelfParticipant.disableScreenShare()→disableScreenShare(onResult:). The old no-callback version is deprecated and will be removed in a future release.RtkStore.subscribe(key, (key, value) → Unit)→subscribe(key, (value) → Unit). The old two-argument callback signature is deprecated but remains functional via a backward-compatible shim.RtkStore.unsubscribe(key, (key, value) → Unit)→unsubscribe(key, (value) → Unit). The old two-argument callback signature is deprecated but remains functional via a backward-compatible shim.
Features
- Added
RtkChat.pin()andRtkChat.unpin()methods to pin and unpin chat messages - Added
RtkChat.getMessagesByUser()to filter messages by sender andRtkChat.getMessagesByType()to filter messages by type - Added
SelfPermissions.canPinMessage()to check whether the local participant has permission to pin messages
Fixes
- Fixed recording state getting stuck as "recording" when stopping a recording that was started by another participant
- Fixed "ghost" participants appearing on the grid when a user was on the setup screen but had not yet joined the socket room
- Fixed webinar host being invisible to other participants when joining late
- Fixed recording bots and other hidden participants incorrectly appearing on the participant grid
- Fixed waitlisted participants appearing in the participant list before being admitted to the meeting
Breaking changes
- Removed Hive SFU support. Only the Cloudflare SFU is supported going forward.
- The default base URI is now
realtime.cloudflare.com. Callinginit()with adyte.iobase domain now fails immediately withMeetingError.InvalidBaseUrl
Fixes
- Added compatibility with new backend plugins API field naming
- Fixed a crash that could occur when accessing the socket controller before
init()was called - Fixed auth token not being sent to the callstats collector endpoint
- Removed custom ping-pong keepalive logic that was only required for the previous infrastructure
Fixes
- Fixed media issues when connection took longer to establish
Fixes
- Resolved crashes that occurred when uploading files
- Improved grid transitions by activating consumers in batches for better performance
- Moved consumer toggle requests off main thread to prevent UI blocking
- Prevented race conditions by canceling reconnection attempts during initialization
Fixes
- Fixed rare crash when toggling audio mute
- Off-stage webinar hosts no longer show up on the grid
Fixes
- Fixed deadlocks in webinar join and screenshare enable flows
- Fixed an issue with camera not working when moving to settings screen and back
- Fixed a rare crash in voice activity detection
Fixes
- Fixed participant tiles not being removed properly when peers left the meeting
- Resolved memory spikes when participants enable or toggle video
- Improved video buffer management to prevent memory buildup
- Enhanced iOS video rendering to match Android behavior
Fixes
- Internal fixes to reduce telemetry verbosity
- Fixed a minor memory leak
Fixes
- Fixed a regression that caused self video to not render if meeting was joined with camera disabled
Fixes
- Fixed unreliable grid behavior with improved refresh logic
Features
- Added
RtkSelfEventListener#onAudioDeviceChangedmethod that is invoked when the current audio route is updated
Fixes
- iOS no longer ignores audio device selection during initial join
Fixes
- Speakerphone is now preferred over earpiece as the default audio output
Breaking changes
- Updated
RtkSelfEventListener#onAudioDevicesUpdatedmethod to provide the list of available devices
Fixes
- Fixed not being able to route audio to Bluetooth devices
Fixes
- Fixed a rare crash during meeting joins in poor network scenarios
Fixes
- Fixed pinned peers not being removed from the stage when kicked
- Media consumers are now created in parallel, which significantly improved the speed of when users start seeing other people's audio/video after joining a meeting
- Fixed "Ghost"/Invalid peers that would sometimes show up in long-running meetings
- Fixed an issue in webinar meetings where the SDK would fail to produce media after being removed from the stage once
Enhancements
- Fixed microphone not working when joining the stage in a webinar
Enhancements
- Fixed a potential crash in poor network scenarios
Features
- Added
RtkSelfParticipant#canJoinStageandRtkSelfParticipant#canRequestToJoinStageAPIs
Fixes
- Fixed viewer unable to join stage in a Livestream
- Fixed user unable to see existing pinned participant after joining meeting
Breaking changes
- Renamed
RtkLivestreamData.roomNametoRtkLivestreamData.meetingIdto match existing API convention - Removed obsolete
WaitingRoomPermissionsabstraction — all the relevant functionality here is available throughHostPermissions - VideoDevice gained a
cameraType: CameraTypeparameter VideoDeviceType#displayNameis now deprecated, and it's recommended to callVideoDevice#toStringinstead to get user-facing names for individualVideoDeviceinstances- Existing APIs related to middlewares were removed and replaced with equivalent counterparts from WebRTC:
RtkSelfParticipant#addVideoMiddleware,RtkSelfParticipant#getVideoMiddlewaresandRtkSelfParticipant#removeVideoMiddlewarewere removed. We do not support middlewares on iOS so these APIs were no-op and were incorrectly exposed.
Features
- Reimplemented middlewares using WebRTC-native primitives to resolve intermittent crashes and other issues.
VideoDevicenow properly labels multiple cameras based on their camera characteristics such as wide-angle and telephoto.
Fixes
- Fixed screen share failing to start
- Silenced log spam from our callstats library
Features
- Active speakers support
Enhancements
- Meeting initialization (
meeting.init()) is now ~60% faster - Switched to an updated and RTK namespaced WebRTC
Breaking changes
- Renamed RtkMessageType to ChatMessageType
Fixes
- Silenced logspam from audio activity reporter
- Improved speed of joining calls
- Auth tokens now automatically trim invalid spaces and newlines
Breaking changes
- Removed deprecated
channelIdfield fromTextMessage - Moved listener types to their respective feature package
- Moved public listeners to their respective feature packages
- Renamed plugin add-remove listener methods for RtkPluginsEventListener
- Moved chat extensions to the
chatpackage - Moved
RtkParticipantto the root package - Moved
RtkMeetingParticipantto the root package - Moved
RtkPluginFileto the plugins package - Moved middlewares to their own package
- Moved
VideoScaleTypeto top levelmediapackage - Dropped
Rtkprefix from audio and video device types - Moved device types to the top level
mediapackage - Dropped
Rtkprefix from polls types - Replaced all LiveStream references with Livestream
- Moved
RtkMeetingParticipantto root package - Stripped
Rtkprefix fromRtkRecordingState - Stripped
Rtkprefix from chat message types - Removed deprecated RtkLivestream#roomName field
- Moved
RtkMediaPermissionto media package and renamed toMediaPermission - Redistributed
featpackage members - Moved
StageStatusclass to stage package - Renamed all event listeners to be of the singular
*EventListenerform
Fixes
- Internal fixes to release pipeline
Fixes
- Added audio activity detection for active speaker signaling