iOS SDK release notes (historical)
Historical Experiences SDK release notes for iOS, 2026 onward. For current releases, use the latest published release notes. For 2025 and earlier, see iOS SDK release notes (historical, 2025 and earlier).
1.21.3 - iOS
Date: 2026-10-15
Breaking changes
Xcode 26 required
- The iOS SDK now requires Xcode 26 or later. See Version requirements.
Added
- Added
onTriggerInteractionLinktoBlazePlayerSourceDelegate, so apps can handle links opened from Engagement Layers.
Live catchup
- While a live stream has a recap, the full-screen Videos player shows a recap button, and can suggest the recap with a Still time to catch up popup or a Live recap banner. Closing the recap returns to the stream at the live edge. Live catchup is enabled per account by WSC Sports and needs no code changes. Hide the button with
BlazeVideosPlayerStyle.buttons.liveCatchup. See Live catchup.
Content entitlements
- Content can be restricted per viewer. Set the viewer token with setExternalUserToken and handle refused items with onContentRestricted on
BlazePlayerSourceDelegate. See Content entitlements.
Stream tokenization
- Live streams can be delivered through tokenized CDN URLs, using the same viewer token as content entitlements. Stream tokenization is enabled per account by WSC Sports. See Stream tokenization.
Followed entities data source
BlazeDataSourceType.followedEntities(entityTypes:orderType:advancedOrderType:maxItems:)shows Moments, Stories, or Videos about the players, teams, and properties the viewer follows. Restrict it to some categories withentityTypes. If the viewer follows nothing, no content is returned. See BlazeDataSourceType and Follow entities.
Follow entity category
BlazeFollowEntity.entityType(BlazeFollowedEntityCategory:.player,.team,.property) carries the type of a followed entity. It's optional, is reported inonFollowEntityClickedandgetFollowedEntities(), and can be passed tosetFollowedEntities,insertFollowedEntities, andremoveFollowedEntities. See Follow entities.
Follow button star icon
- The Follow button can show a star. Set
iconSource = .staronfollowEntity.followState.chipandfollowEntity.unfollowState.chipfor an outlined star while unfollowed and a filled star while followed..defaultkeeps the+and the checkmark. See Icon source options.
Subtitle and description on Moments widgets
subtitleanddescriptiononBlazeWidgetItemStyleshow a Moment's subtitle and description under its title. Both are hidden by default, have their own unread and read text styles liketitle, and move with the title's position as one block.topSpacingsets the space above each line. See BlazeWidgetItemSubtitleStyle and BlazeWidgetItemDescriptionStyle.
Story page title
- The Stories player shows the page title set in the CMS as a second header row, under the Story title. Pages without a title show no row. Style it with
subtitleonBlazeStoryPlayerStyle. See BlazeStoryPlayerSubtitleTextStyle.
Audio track selector for live streams
- The Videos full-screen player shows an audio button for live streams with more than one audio track, so viewers can switch commentary feeds. Their choice is remembered. Controlled by
BlazeVideosPlayerStyle.buttons.audio, visible by default. See Audio track selection.
Liquid Glass
- Opt-in Liquid Glass on iOS 26 and later for player and widget controls. Set
Blaze.shared.isLiquidGlassEnabled = true, and useglassBackground(.automatic,.on,.off) to control individual elements. See Liquid Glass.
Badge images from the CMS
- Widget items can show a badge image set per Story, Moment, or Video in the CMS. It replaces the badge background image, shows the badge even when
isVisibleisfalse, and hides the badge for that item if the image fails to load. See BlazeWidgetItemBadgeStyle.
Moments tabs reselection
onTabReselectedonBlazePlayerContainerTabsDelegateis called when the viewer taps the title of the tab that's already selected, for example to reload it withreloadTab(at:). It isn't called for programmatic selection or swipes. See reloadTab.
Moments tabs and safe areas
ignoresBottomSafeAreaandignoresTopSafeAreaonBlazePlayerTabsStylelet Moments tabs content extend behind the host app's bottom or top safe area, such as a tab bar. The defaults (falseandtrue) keep the current behavior. See BlazePlayerTabsStyle.
Moments player and the bottom safe area
ignoresBottomSafeAreaonBlazeMomentsPlayerStylelets the Moments player's video extend behind the bottom safe area, such as the home indicator or your app's tab bar. The player controls stay above it. Defaultfalse. Inside Moments tabs containers, useBlazePlayerTabsStyle.ignoresBottomSafeAreainstead. See BlazeMomentsPlayerStyle.
Cold start status
Blaze.shared.isInColdStart(for:)returns whether the current viewer's For you feed for a content type is served cold start content (true) or personalized content (false). Returnsnilwhen the status is unknown, for example for an anonymous viewer. Call it on the main thread. See Implicit personalization.
Privacy settings from the Back Office
- WSC Sports can enforce
disableAnalyticsanddoNotTrackUserfor your app from the Back Office. An enforced setting applies even if your app sets it tofalse, and stays in effect across launches. Your app's own settings are unchanged when nothing is enforced. See disableAnalytics.
Changed
Moments tabs selected index
onTabSelectedonBlazePlayerContainerTabsDelegatenow reportstabIndexas the zero-based index among visible tabs, matchingonTabReselectedandreloadTab(at:). It isn't called when the selection lands on a hidden tab. If your app hides tabs withisVisible = false,onTabSelectednow reports a differenttabIndexthan before. Behavior is unchanged when all tabs are visible.
Follow button accessibility
- VoiceOver now reads Unfollow with the entity name on a followed Follow button.
Moments mute button accessibility
- The Moments player mute button now has a VoiceOver label, like the Stories and Videos mute buttons.
Fixed
Moments ad frequency
- Moments ads now appear at the configured frequency regardless of how content loads. The SDK keeps a running count of Moments viewed across the player session, so the count no longer resets when new content is loaded.
Live stream loading
- The Videos player no longer shows an endless loading spinner when a live stream's media can't be loaded, for example because of an unreachable host, a malformed URL, or a certificate error.
Picture in Picture pause
- The Videos player no longer gets stuck on the loading spinner when the video was paused from the Picture in Picture window and the viewer returns to full screen.
Pause and resume with other screens presented
pauseCurrentPlayer()andresumeCurrentPlayer()no longer freeze the app when a screen that isn't a Blaze player, such as a share sheet or a web view, is presented.
Moments tabs reload
- Reloading the visible tab no longer closes the full-screen Moments tabs player, and no longer calls
onPlayerDidDismiss.
Captions sheet orientation
- On iPhone, opening the captions or audio sheet in the Moments tabs player no longer allows the screen to rotate to landscape.
Moments tabs on iPad
- On iPad, the Moments tabs bar no longer sits under the host app's floating top tab bar.
Moments player safe area
- The Moments player now updates its layout as soon as the safe area changes. Previously the change applied only after more Moments were appended or the player was refreshed.
Widget item text position
- Long titles, subtitles, and descriptions on widget items now start at the offset set in
title.position, like short ones, and wrap within the remaining width.
Videos inline preview title
- The title in the Videos inline preview player now stays at the top of the player.
Widget thumbnail loading
- Widgets that don't use animated thumbnails no longer download GIF previews, so thumbnails load faster on first launch.
1.20.3 - iOS
Date: 2026-08-31
Fixed
SDK initialization stability
Fixed a race condition during SDK initialization that could crash the host app.
1.20.1 - iOS
Date: 2026-07-23
Added
Keep empty tabs visible
isTabVisibleWhenEmpty on BlazePlayerTabsStyle controls whether a tab with no content, or a failed load, stays visible. Defaults to true. See isTabVisibleWhenEmpty.
A tab that stays visible presents the player's empty or error state. When set to false, a tab is removed after its content is prepared. The first tab is always kept, whether or not it has content.
This changes the default for every app, not only apps that requested it.Empty tabs were previously hidden automatically. They're now visible again by default. If your app relies on the automatic hiding, set
isTabVisibleWhenEmpty = falseto keep that behavior.
1.20.0 - iOS
Date: 2026-07-20
Breaking changes
For you cold start labels
Renamed the Recommendations For you parameter from promotedLabels to coldStartLabels. Update any For you data source that still passes promotedLabels. See Implicit personalization.
Widget remote identifier
Renamed widgetRemoteId to widgetRemoteIdentifier on widget init and related APIs. Update call sites to the new name. CMS-configured widgets are supported starting with this version: set widgetRemoteIdentifier so content creators can configure widgets in Experiences CMS. See CMS-configured widgets and Widget initialization.
Added
Item click thumbnail
BlazeWidgetItemClickParams now includes contentThumbnailUrl, the URL of the clicked item's main thumbnail (Stories, Moments, and Videos widgets). See BlazeWidgetItemClickHandlerState.
Closed captions style
BlazeCaptionsStyle for customizing closed captions in the player.
Moments likes count threshold
shouldPreserveLikesCountBelowThreshold on BlazeMomentsPlayerButtonsStyle.
CTA border customization
borderColor and borderWidth on Moments, Stories, and Videos CTA styles. See BlazeMomentsPlayerCtaStyle, BlazeStoryPlayerCtaStyle, and BlazeVideosPlayerCtaStyle.
Stories pre-roll ads
ads.enablePreroll on BlazeStoriesPlaybackConfiguration. When enabled, the fixed-position ad on the first page plays as a pre-roll instead of being skipped. Default is false.
Moments tabs chrome
isTabTitleVisibleWhenSingleTab and activeTabIndicator on BlazePlayerTabsStyle. See Moments widget tabs.
Share extra info
extraInfo on BlazeShareParams. See BlazePlayerSourceDelegate.
Compose Data Source
composite to enable multiple data sources in a single call. See BlazeDataSourceType.composite: iOS
Videos player overlay auto-hide time
overlayVisibilityThreshold on BlazeVideosPlayerStyle sets how long (in seconds) the player controls overlay stays visible before it auto-hides. Non-positive values (zero or negative) fall back to the default. Presets keep the current default of 3.0 seconds.
Live streaming
Streaming video (CMS Streams / live video) is supported starting with this version. The Videos player and widgets now support live video streams alongside on-demand videos. A live stream is a video that carries stream metadata, so it plays through the standard Videos player and widgets: there is no separate live player. See Video content type delivery.
BlazeVideosFilterParams(contentTypes,streamStates) surfaces streams viaBlazeVideosWidgetView.videosFilterParamsandBlaze.shared.playVideos/prepareVideos. By default only on-demand videos are returned, so include.streamto show live content.BlazeVideoContentType(.video/.stream) andBlazeLiveStreamStatus(.live/.upcoming/.ended) identify the content type and the stream lifecycle.- Order streams with
BlazeOrderType(.startTimeDesc/.startTimeAsc) andBlazeAdvancedOrderType(.liveFirst). - Customize the player's live UI with
statusIndicator(BlazeVideosPlayerStatusIndicatorStyle),backToLiveButton(BlazeVideosPlayerBackToLiveButtonStyle), andwaitingRoomMessageonBlazeVideosPlayerStyle; style the live/upcoming/ended chip on widget items with BlazeWidgetItemStatusIndicatorStyle.
See Live streaming.
Removed
Removed BlazeDataSourceType.remoteConfig. CMS-configured widgets are supported starting with this version through widgetRemoteIdentifier at widget initialization. See CMS-configured widgets.
Changed
Videos multi-aspect ratio default
Default of BlazeVideosPlaybackConfiguration.multiAspectRatio changed from false to true.
1.19.0 - iOS
Date: 2026-05-17
Added
- Added
extraInfo: [String: String]toBlazeWidgetItemClickParams, exposing the content item's key-value metadata to the widget click handler. See BlazeWidgetItemClickHandlerState. - Added shimmer color customization for widgets via the new
BlazeWidgetShimmeringStyletype, exposed onBlazeWidgetLayout.shimmering. See BlazeWidgetShimmeringStyle. - Added configurable buffering spinner delay to all player types:
bufferingSpinnerDelayadded to BlazeMomentsPlaybackConfiguration and BlazeVideosPlaybackConfiguration.- Introduced new
BlazeStoriesPlaybackConfigurationwithbufferingSpinnerDelayand a new global methodBlaze.shared.setDefaultStoriesPlaybackConfiguration(). See BlazeStoriesPlaybackConfiguration.
- Added Widget to Tabs support for Moments widgets. A new
init(layout:tabsContainer:)initializer onBlazeMomentsWidgetRowView/BlazeMomentsWidgetGridView(UIKit) and a newBlazeSwiftUIMomentsWidgetViewModel(widgetConfiguration:tabsContainer:)initializer (SwiftUI) launch a fullscreen tabs player on item tap. See Moments Widget to Tabs. - Added SDK-wide sound state control via the new BlazePlayerSoundState type and
Blaze.shared.setPlayerSoundState()method, allowing apps to mute or unmute all story, moment, and video playback globally.
Updated
- Updated the
GoogleMobileAdsdependency range to support version 13.x.
Fixed
- Fixed a possible crash caused by ICU memory allocation during geo validation on background launch.
- Fixed Moments Tabs
isVisibleproperty not correctly hiding or showing tabs as expected. - Fixed the 2x speed indicator overlapping the Moments Tabs header.
- Fixed the 2x speed indicator not appearing on iPad during 2x playback.
- Fixed Moments Tabs not playing content on RTL devices.
1.18.1 - iOS
Date: 2026-04-20
Added
Moments tabs: programmatic content reload
You can now programmatically refresh the content of your Moments tabs component without requiring users to navigate away and back.
New public methods describedhere
Story player: title image
A contextual image can now be displayed alongside the story title in the player header. See Storyplayertitleimagestyle
New public types: BlazeStoryPlayerTitleImageStaticSource, BlazeStoryPlayerTitleImageSource, BlazeStoryPlayerTitleImageStyle.
1.17.2 - iOS
Date: 2026-03-26
Added
- SDK initialization is now deferred until the app is in the foreground, preventing unintended initialization during background launches.
1.17.1 - iOS
Date: 2026-03-10
Fixed
- PiP abruptly closed while scrolling in lazy lists.
1.17.0 - iOS
Date: 2026-03-08
Added
- Added AirPlay casting functionality to the Videos player. Requires
NSLocalNetworkUsageDescriptioninInfo.plistand the Audio, AirPlay, and Picture in Picture background mode enabled. See BlazeCastingManager. - Added auto-advance functionality to the Moments player. See BlazeMomentsPlaybackConfiguration.
- Added Picture-in-Picture (PiP) support to the Videos player. Powered by Apple's native PiP framework. See BlazePipManager.
- Added
onShareClickedmethod to allow apps to fully override the share link creation. See onShareClicked. - Added a new Search functionality (free text content search UI):
- Stand-alone API: Blaze.shared.showSearchScreen.
- In-player experience: BlazeMomentsPlayerButtonsStyle.buttons.search.
- Added Seek buttons to Moments and Videos players. See Moments Seek and Videos Seek.
- Added X2 speed mode for Moments and Videos players.
- Added double-tap gesture to Videos player.
1.16.3 - iOS
Date: 2026-01-18
Fixed
- Fixed synchronization between moments players' likes state when multiple players live with the same content at the same time.
- Performance enhancements.
Updated 1 day ago
