Skip to content

5.12.0 Release - #4289

Merged
github-actions[bot] merged 13 commits into
mainfrom
release/5.12.0
Sep 28, 2026
Merged

github-actions[bot] merged 13 commits into
mainfrom
release/5.12.0

Conversation

@Stream-SDK-Bot

Copy link
Copy Markdown
Collaborator

✅ Added

  • Add AudioSessionConfiguring variants with a completion handler for reporting audio session activation errors #4286

🐞 Fixed

  • Fix channel data being overridden by events with stale channel data #4278
  • Fix UI hang caused by activating or deactivating the audio session on the main thread #4286

🔄 Changed

StreamChatUI

✅ Added

  • Improved support for the iPhone Duo #4287

🐞 Fixed

  • Fix incorrect rounded corner on image attachments shown below other attachments #4277
  • Fix empty voice recording preview when quoting a message with multiple attachments #4276

Stream Bot and others added 13 commits September 10, 2026 11:05
…4278)

* Fix channel state being overwritten by older event snapshots

Skip saveChannel when an incoming payload has an older updatedAt so nested snapshots on member.updated cannot rewind channel data.

* Add changelog PR link for stale channel snapshot fix

* Simplify the stale channel updatedAt check

Compare payload.updatedAt with the stored DTO date directly, and align the changelog wording with the PR title.

* Apply suggestion from @nuno-vieira

* Use fixed timestamps in stale channel snapshot tests

Date() round-trips through Core Data lose sub-microsecond precision, so comparing against the stored dates failed.

* Give test channel updates a newer updatedAt

Dummy payloads used a random updatedAt, so the stale-snapshot guard skipped later saves that were meant to refresh names and capabilities.

* Use a fixed later timestamp for test channel updates

Replace the ad-hoc Date() and Date().addingTimeInterval(60) values with a
shared channelLaterUpdateDate constant, so payloads that must be applied on
top of an already saved channel always win the updatedAt comparison.
* Migrate channel query to OpenAPI generated v2 endpoint

* Omit watchers limit for backend default page size in v2 channel requests

* Fix build error after merge

* Save threads from channel payload

* Fix tests

* Remove partially failing channel list tests

* Refactor fillIds
@Stream-SDK-Bot
Stream-SDK-Bot requested a review from a team as a code owner September 24, 2026 10:55
@coderabbitai

coderabbitai Bot commented Sep 24, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 520f997e-cd37-4215-a771-456b6ceca178

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Stream-SDK-Bot

Copy link
Copy Markdown
Collaborator Author

SDK Size

title previous release current release diff status
StreamChat 7.58 MB 7.64 MB +58 KB 🟢
StreamChatUI 3.38 MB 3.38 MB +2 KB 🟢
StreamChatCommonUI 0.99 MB 0.99 MB 0 KB 🟢

@Stream-SDK-Bot

Copy link
Copy Markdown
Collaborator Author

StreamChat XCSize

Object Diff (bytes)
ChannelListPayload.o -56108
ChannelStateResponse.o +9606
UpdateChannelRequest.o +7119
MessagePaginationParams.o +6797
QueryChannelsRequest.o +6628
Show 96 more objects
Object Diff (bytes)
ChannelInput.o +6399
ChannelGetOrCreateRequest.o +6012
MessagePayloads.o -5692
ChannelInputRequest.o +5664
ChannelQuery.o -5501
GroupedChannelsBucket.o +5231
RequestEncoder.o +5152
GroupedQueryChannelsRequest.o +5018
ParsedPredefinedFilterResponse.o +5017
UpdateChannelResponse.o +4855
PendingMessageResponse.o +4849
MessageReactionDTO.o +4786
QueryChannelsResponse.o +4688
GroupedChannelsGroupRequest.o +4665
UpdateChannelPartialResponse.o +4662
UpdateChannelPartialRequest.o +4547
GroupedQueryChannelsResponse.o +4529
PaginationParams.o +4458
ChannelUpdater.o -3993
ChannelEndpoints.o -3850
AttachmentDownloader.o +3217
DefaultEndpoints.o +3119
ChannelEditDetailPayload.o +2843
AudioSessionConfiguring.o +2503
AudioRecording.o +2488
StreamCDNStorage.o +2464
MissingEventsPayload.o +2451
ChannelSearch.o +2172
ChannelListQuery.o +1174
Chat.o -1169
ChannelListUpdater.o -1060
LivestreamChannelController.o -926
AnyAttachmentPayload.o +880
APIClient.o +832
SortParamRequest.o +730
UnknownChannelEvent.o +680
AudioPlaying.o +676
Pagination.o +676
UserUpdater.o -568
ChannelMemberListUpdater.o -540
ThreadDTO.o -532
AudioAnalysisEngine.o +528
BanRequest.o +496
ChannelId.o -480
ChannelRepository.o -408
ChatClient.o +404
ChannelDTO.o +385
MessageUpdater.o +372
MessageController.o -356
Sequence+CompactMapLoggingError.o +352
Member.o +272
ChannelPayload+asModel.o +264
AssetPropertyLoading.o +252
SharedLocationsResponse.o -204
ChatChannelWatcherListController.o -200
ChannelWatcherListQuery.o +196
UpdateMemberPartialRequest.o -196
CurrentUserUpdater.o +192
ThreadStateResponse.o -190
QueryMembersPayload.o -186
GuestUserTokenRequestPayload.o +172
Token.o +172
CreatePollRequestBody.o -168
UserPayloads.o -162
MessageRequest.o +160
MessageModerationDetailsPayload.o -148
Device.o -148
ChannelController.o -148
QueryThreadsResponse.o -146
LivestreamChat.o -144
IdentifiablePayload.o -140
AttachmentDTO.o -140
MessageDTO.o +137
MulticastDelegate.o -136
ChatRemoteNotificationHandler.o +132
Filter.o -128
UserPayload.o +120
AddUserGroupMembersRequest.o +118
ManualEventHandler.o -112
APIPathConvertible.o -108
ChannelMemberListPayload.o +102
QueryDraftsRequest.o -101
ChannelListQueryDTO.o -100
Channel.o +93
SendMessageResponsePayload.o -88
UserPrivacySettings.o -84
ChatMessageAttachment.o -80
MessageAttachmentPayload+Extensions.o +72
DeleteMessageResponse.o -68
ChannelMemberListQuery.o +68
MessageSearchController.o -64
PollVoteDTO.o +64
SystemMessage.o +64
MessageSender.o -57
MemberListController.o -52
SyncOperations.o +48

@Stream-SDK-Bot

Copy link
Copy Markdown
Collaborator Author

StreamChatUI XCSize

Object Diff (bytes)
GalleryVC.o +3126
VoiceRecordingAttachmentQuotedPreview.o +1695
ChatMessagePopupVC.o +1452
ZoomAnimator.o +616
QuotedChatMessageView.o +264
Show 6 more objects
Object Diff (bytes)
MessageActionsTransitionController.o +248
GalleryAttachmentViewInjector.o +200
ChatChannelHeaderView.o +176
ComposerKeyboardHandler.o +167
ChatSuggestionsHeaderView.o +80
ComposerVC.o +72

@github-actions

Copy link
Copy Markdown
1 Warning
⚠️ Big PR

Generated by 🚫 Danger

@github-actions

Copy link
Copy Markdown

Public Interface

+ public extension AudioSessionConfiguring



 open class ChatMessagePopupVC: _ViewController, ComponentsProvider  
-   override open func setUpAppearance()
+   override open func viewWillTransition(to size: CGSize,with coordinator: UIViewControllerTransitionCoordinator)
-   override open func setUpLayout()
+   override open func viewDidLayoutSubviews()
-   open func addBlurView()
+   override open func setUpAppearance()
-   open func addScrollView()
+   override open func setUpLayout()
-   open func addContentView()
+   open func addBlurView()
-   open func addMainContainerView()
+   open func addScrollView()
-   open func addReactionPickerView()
+   open func addContentView()
-   open func addMessageView()
+   open func addMainContainerView()
-   open func addMessageActionsView()
+   open func addReactionPickerView()
-   open func addReactionAuthorsView()
+   open func addMessageView()
-   open func layoutMainContainerView()
+   open func addMessageActionsView()
-   open func layoutMessageView()
+   open func addReactionAuthorsView()
-   open func layoutReactionPickerView()
+   open func layoutMainContainerView()
-   open func layoutMessageActionsView()
+   open func layoutMessageView()
-   open func layoutReactionAuthorsView()
+   open func layoutReactionPickerView()
-   open func layoutPositionOfMessageView()
+   open func layoutMessageActionsView()
-   @objc open func didTapOnView(_ gesture: UITapGestureRecognizer)
+   open func layoutReactionAuthorsView()
+   open func layoutPositionOfMessageView()
+   @objc open func didTapOnView(_ gesture: UITapGestureRecognizer)

 open class ZoomAnimator: NSObject, UIViewControllerAnimatedTransitioning  
-   public var isPresenting: Bool
+   public weak var toContentView: UIView?
-   
+   public var isPresenting: Bool
- 
+   
-   open func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?)-> TimeInterval
+ 
-   open func animateTransition(using transitionContext: UIViewControllerContextTransitioning)
+   open func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?)-> TimeInterval
-   open func animateZoomInTransition(using transitionContext: UIViewControllerContextTransitioning)
+   open func animateTransition(using transitionContext: UIViewControllerContextTransitioning)
-   open func animateZoomOutTransition(using transitionContext: UIViewControllerContextTransitioning)
+   open func animateZoomInTransition(using transitionContext: UIViewControllerContextTransitioning)
-   open func prepareZoomOutTransition(using transitionContext: UIViewControllerContextTransitioning)
+   open func animateZoomOutTransition(using transitionContext: UIViewControllerContextTransitioning)
-   open func animateDismiss(using transitionContext: UIViewControllerContextTransitioning)
+   open func prepareZoomOutTransition(using transitionContext: UIViewControllerContextTransitioning)
+   open func animateDismiss(using transitionContext: UIViewControllerContextTransitioning)

 open class GalleryVC: _ViewController, UIGestureRecognizerDelegate, AppearanceProvider, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, ComponentsProvider  
-   open func shareItem(at indexPath: IndexPath)-> Any?
+   override open func viewSafeAreaInsetsDidChange()
-   open func prepareShareItem(at indexPath: IndexPath)async -> Any?
+   open func shareItem(at indexPath: IndexPath)-> Any?
-   open func cellReuseIdentifierForItem(at indexPath: IndexPath)-> String?
+   open func prepareShareItem(at indexPath: IndexPath)async -> Any?
-   open func handleSingleTapOnCell(at indexPath: IndexPath)
+   open func cellReuseIdentifierForItem(at indexPath: IndexPath)-> String?
-   
+   open func handleSingleTapOnCell(at indexPath: IndexPath)
- 
+   
-   public struct Content  
+ 
-   
+   public struct Content  
-     public var message: ChatMessage
+   
-     public var currentPage: Int
+     public var message: ChatMessage
-     
+     public var currentPage: Int
-   
+     
-     public init(message: ChatMessage,currentPage: Int = 0)
+   
+     public init(message: ChatMessage,currentPage: Int = 0)

- open class VoiceRecordingAttachmentQuotedPreview: _View, ComponentsProvider  
+ open class VoiceRecordingAttachmentQuotedPreview: _View, AppearanceProvider, ComponentsProvider  
-   
+   open var minimumFontScaleFactor: CGFloat
- 
+   
-   override open func setUpLayout()
+ 
-   override open func updateContent()
+   override open func setUpAppearance()
-   
+   override open func setUpLayout()
- 
+   override open func updateContent()
-   public struct Content  
+   
-   
+ 
-     public var title: String
+   public struct Content  
-     public var size: Int64
+   
-     public var duration: TimeInterval
+     public var title: String
-     public var audioAssetURL: URL
+     public var size: Int64
-     
+     public var duration: TimeInterval
-   
+     public var audioAssetURL: URL
-     public init(title: String,size: Int64,duration: TimeInterval,audioAssetURL: URL)
+     
+   
+     public init(title: String,size: Int64,duration: TimeInterval,audioAssetURL: URL)

 open class StreamAudioSessionConfigurator: AudioSessionConfiguring, @unchecked Sendable  
-   open func deactivateRecordingSession()throws 
+   open func activateRecordingSession(completion: (@Sendable (Error?) -> Void)?)throws 
-   open func activatePlaybackSession()throws 
+   open func deactivateRecordingSession()throws 
-   open func deactivatePlaybackSession()throws 
+   open func deactivateRecordingSession(completion: (@Sendable (Error?) -> Void)?)throws 
-   open func requestRecordPermission(_ completionHandler: @escaping @Sendable (Bool) -> Void)
+   open func activatePlaybackSession()throws 
+   open func activatePlaybackSession(completion: (@Sendable (Error?) -> Void)?)throws 
+   open func deactivatePlaybackSession()throws 
+   open func deactivatePlaybackSession(completion: (@Sendable (Error?) -> Void)?)throws 
+   open func requestRecordPermission(_ completionHandler: @escaping @Sendable (Bool) -> Void)

@github-actions

Copy link
Copy Markdown

Build for regression testing №123457170 has been uploaded to TestFlight 🎁

@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
7.5% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@Stream-SDK-Bot

Copy link
Copy Markdown
Collaborator Author

SDK Performance

target metric benchmark branch performance status
MessageList Hitches total duration 10 ms 3.34 ms 66.6% 🔼 🟢
Duration 2.6 s 2.49 s 4.23% 🔼 🟢
Hitch time ratio 4 ms per s 1.36 ms per s 66.0% 🔼 🟢
Frame rate 75 fps 79.67 fps 6.23% 🔼 🟢
Number of hitches 1 0.4 60.0% 🔼 🟢

@testableapple

Copy link
Copy Markdown
Member

/merge release

@testableapple

Copy link
Copy Markdown
Member

Publication of the release has been launched 👍

@github-actions
github-actions Bot merged commit 7ef32c8 into main Sep 28, 2026
24 of 30 checks passed
@github-actions
github-actions Bot deleted the release/5.12.0 branch September 28, 2026 12:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants