Released: 2026-06-24 Updated: 2026-07-01
Summary: Breaking changes include a new singleton accessor pattern, required framework additions (util.framework and zContext.framework), updated API naming for consistency across methods, and removal of the format parameter from sendVideoFrame. Adds a pre-connection flow to accelerate session joins, machine-answer detection for PSTN call-outs, and comprehensive audio QoS statistics including jitter buffer metrics, concealment data, and audio energy measurements. Additional improvements include user failover status tracking, expanded command channel payload limits (now 1024 bytes), external video source format configuration, and new callbacks for subsession status changes that trigger when users join or leave subsessions.
Breaking Changes
-
New singleton accessor
+[ZoomVideoSDK sharedInstance]. -
Add
util.framework(required) for the Video SDK iOS/VisionOS platform. -
Add
zContext.framework(required) for the Video SDK iOS/VisionOS platform. -
Joining or leaving a subsession now triggers the
onSubSessionStatusChanged:subSession:andonSessionLeave:callbacks inZoomVideoSDKDelegate. -
Rename several APIs for naming consistency and remove the
formatparameter fromsendVideoFrame.- (BOOL)isMicOriginalInputEnable; → - (BOOL)isMicOriginalInputEnabled; - (BOOL)isAllowViewFullTranscriptEnable; → - (BOOL)isAllowViewFullTranscriptEnabled; - (BOOL)isFileTransferEnable; → - (BOOL)isFileTransferEnabled; - (void)sendVideoFrame:(char *)frameBuffer width:(NSUInteger)width height:(NSUInteger)height dataLength:(NSUInteger)dataLength rotation:(ZoomVideoSDKVideoRawDataRotation)rotation format:(ZoomVideoSDKFrameDataFormat)format → - (void)sendVideoFrame:(char *)frameBuffer width:(NSUInteger)width height:(NSUInteger)height dataLength:(NSUInteger)dataLength rotation:(ZoomVideoSDKVideoRawDataRotation)rotation;
Added
-
Add a pre-connection (two-step join) flow to speed up the actual session join.
-
New interfaces in
ZoomVideoSDK- (ZoomVideoSDKSession * _Nullable)prepareJoin:(ZoomVideoSDKSessionContext * _Nonnull)context preJoinParam:(ZoomVideoSDKPreJoinParam * _Nonnull)preJoinParam; - (ZoomVideoSDKError)commitJoin; - (ZoomVideoSDKError)cancelPrepareJoin; -
New class
ZoomVideoSDKPreJoinParaminZoomVideoSDK.h@interface ZoomVideoSDKPreJoinParam : NSObject @property (nonatomic, assign) NSUInteger timeoutInterval; @end -
New error codes in
ZoomVideoSDKError(ZoomVideoSDKConstants.h)Errors_Session_PreJoin_Not_In_Flow, Errors_Session_PreJoin_Already_Commit, Errors_Session_PreJoin_Timeout,
-
-
Add machine-answer detection for PSTN call-out, so the host can tell whether a call was answered by a person or forwarded to voicemail.
-
New value in
ZoomVideoSDKPhoneStatus(ZoomVideoSDKConstants.h)/** The call was answered by machine. */ ZoomVideoSDKPhoneStatus_AnsweredByMachine, -
New property in
ZoomVideoSDKInvitePhoneUserInfo(ZoomVideoSDKPhoneHelper.h)/** * @brief Determines whether to enable machine-answer detection for this callout. */ @property (nonatomic, assign) BOOL bDetectMachine;
-
-
New enumeration values in
ZoomVideoSDKSessionLeaveReason(ZoomVideoSDKConstants.h)./** User leaves current session because joining a subsession. */ ZoomVideoSDKSessionLeaveReason_JoinSubsession, /** User leaves current session because returning to the main session. */ ZoomVideoSDKSessionLeaveReason_ReturnToMainSession, -
Add a new property
externalVideoSourceDataFormattoZoomVideoSDKSessionContext(ZoomVideoSDK.h)./** * @brief [Optional] The frame data format used for external video source initialization. * @note Effective when externalVideoSourceDelegate is set. Default is ZoomVideoSDKFrameDataFormat_I420. */ @property (nonatomic, assign) ZoomVideoSDKFrameDataFormat externalVideoSourceDataFormat; -
Provide audio QoS statistics data.
-
New property in
ZoomVideoSDKQOSSendStatistics(ZoomVideoSDKUser.h)/** @brief Gets the total bytes of RTP headers (and padding) sent (send only). */ @property (nonatomic, assign, readonly) NSUInteger headerBytesSent; -
New properties in
ZoomVideoSDKQOSRecvStatistics(ZoomVideoSDKUser.h)/** @brief Gets the total bytes of RTP headers (and padding) received (receive only). */ @property (nonatomic, assign, readonly) unsigned long long headerBytesReceived; /** @brief Gets the non-FEC packets discarded by NetEQ (receive only, audio only). */ @property (nonatomic, assign, readonly) NSUInteger packetsDiscarded; /** @brief Gets the total number of FEC packets received (receive only, audio only). */ @property (nonatomic, assign, readonly) NSUInteger fecPacketsReceived; /** @brief Gets the FEC packets discarded by NetEQ (receive only, audio only). */ @property (nonatomic, assign, readonly) NSUInteger fecPacketsDiscarded; /** @brief Gets the accumulated current target delay of the jitter buffer, in seconds (receive only, audio only). */ @property (nonatomic, assign, readonly) double jitterBufferTargetDelay; /** @brief Gets the accumulated minimum achievable jitter buffer delay, in seconds (receive only, audio only). */ @property (nonatomic, assign, readonly) double jitterBufferMinimumDelay; /** @brief Gets the total audio samples generated by NetEQ (receive only, audio only). */ @property (nonatomic, assign, readonly) unsigned long long totalSamplesReceived; /** @brief Gets the samples produced by concealment instead of real decode (receive only, audio only). */ @property (nonatomic, assign, readonly) unsigned long long concealedSamples; /** @brief Gets the subset of concealedSamples that are silent (receive only, audio only). */ @property (nonatomic, assign, readonly) unsigned long long silentConcealedSamples; /** @brief Gets the number of concealment events (receive only, audio only). */ @property (nonatomic, assign, readonly) unsigned long long concealmentEvents; /** @brief Gets the samples inserted to slow down playout, i.e. deceleration (receive only, audio only). */ @property (nonatomic, assign, readonly) unsigned long long insertedSamplesForDeceleration; /** @brief Gets the samples removed to speed up playout, i.e. acceleration (receive only, audio only). */ @property (nonatomic, assign, readonly) unsigned long long removedSamplesForAcceleration; /** @brief Gets the total duration of all audio samples received, in seconds (receive only, audio only). */ @property (nonatomic, assign, readonly) double totalSamplesDuration; /** @brief Gets the most recent audio level of the received stream, range [0.0, 1.0] (receive only, audio only). */ @property (nonatomic, assign, readonly) double audioLevel; /** @brief Gets the accumulated audio energy of the received stream (receive only, audio only). */ @property (nonatomic, assign, readonly) double totalAudioEnergy;
-
-
Support user failover status change.
-
New callback in
ZoomVideoSDKDelegate(ZoomVideoSDKDelegate.h)- (void)onUserFailoverStatusChanged:(ZoomVideoSDKUser * _Nullable)user inFailover:(BOOL)inFailover; -
New interface in
ZoomVideoSDKUser(ZoomVideoSDKUser.h)- (BOOL)isInFailover;
-
Deprecated
- The
+[ZoomVideoSDK shareInstance]method has been deprecated; use+[ZoomVideoSDK sharedInstance]instead.
Changed
- Increase the command channel payload size limit to 1024.
Fixed
- Fixed an issue where
canChatMessageBeDeletedincorrectly returnedErrors_Not_In_SessionorErrors_Session_Module_Not_Foundwhen a valid session existed.