The format is based on Keep a Changelog.
- Fix not possible to resend messages with failed attachments #2966
- Fix not mentioning users if they are not fetched in the local device #2967
- Fix rare crash in
startObserver()
in login/logout flow #2972
- Fix file attachments retry button not retrying upload #2966
- Fix mentioned users without names not highlighted #2967
- Fix duplicated mentioned users not highlighted #2967
January 09, 2024
- Fix Channel ID initializer crashing with an empty string #2964
- Expose
UserListQuery.search(term:)
andUserListQuery.user(withID:)
#2959
- Better support for custom mixed attachments rendering #2947
- Add default rendering for unsupported attachments #2948
- Fix deleted messages showing custom attachments #2947
- Fix blocked messages showing attachments #2947
- Minor breaking change in the
ChatMessageListView.reuseIdentifier()
function. It has a newmessage
parameter. #2947 - Minor breaking change in the
ChatMessageListView.dequeueReusableCell()
function. It has a newmessage
parameter. #2947
December 21, 2023
- Fix duplicated Runpath Search Paths #2937
- Fix
_dispatch_lane_resume
crash inRepeatingTimer
#2938 - Fix editing of async voice messages #2943
- Fix duplicated Runpath Search Paths #2937
- Fix file attachments not rendering file size #2941
- Fix quoted chat message view with wrong text #2946
- Fix jumping to bottom when loading new messages #2945
- Fix messages failing to be deleted when pending updates to the server #2949
December 11, 2023
- Add an option to configure the AudioSession when using VoiceRecordings #2919
- Fix
UserInfo.isInvisible
not nullable #2920 - Fix CocoaPods minimum iOS target not in sync with the Xcode project #2924
- Improve
InternetConnection.Monitor
stability #2923
- The
UserInfo.isInvisible
is now nullable andnil
by default #2920
- Fix date separator decoration view showing in the last message of the current page #2899
- Fix
JumpToUnreadMessagesButton
not localizable #2917 - Fix CocoaPods minimum iOS target not in sync with the Xcode project #2924
- Fix quoting message without bubble view when text is only emojis #2925
- Fix user mention not tappable when contains "@" character #2928
- Fix user mention not tappable if user does not have a name #2928
- Fix edit action possible in giphy messages #2926
- Fix not adding a space in the message input when mentioning a user #2927
- iOS 11 support has been dropped since Xcode 15 does not allow publishing apps with iOS 11.
November 30, 2023
- Fix skip slow mode capability not handled #2904
- Fix layout crash when sending an app to background and ChatMessageGalleryView is visible #2907
- Fix channel history being marked as read for new members #2905
ChannelController.markUnread
'scompletion
's argument is now a(Result<ChatChannel, Error>
instead ofError?
November 17, 2023
- Add new
NewMessageErrorEvent
when observingEventsController
#2885
- Add jump to unread messages interaction #2894
- Add support for opening a channel in the unread messages page with
Components.shouldJumpToUnreadWhenOpeningChannel
#2894
- Fix Message List UI not updated when message.updatedAt changes #2884
- Fix jump to unread button showing "0" unread counts #2894
- Fix not able to mark channel read when isJumpToUnread is disabled #2902
November 14, 2023
- Fix not able to mark channel read after clearing history #2867
- Fix pasting images from browser when isPastingImagesEnabled is false #2874
- Fix not being able to paste images when multiple attachments are present #2874
- Fix ComposerVC InputTextView caret's position issues #2878
- Fix avatar alignment in quoted messages #2876
- Add support for editing custom attachments #2879
- Fix composer not interactable after enabling send-message capability #2866
November 03, 2023
- Add message moderation details to
ChatMessage
#2846 - Add support for resending, editing and deleting bounced messages #2846
- Fix not being able to delete local-only messages #2846
- Fix bounced message displayed as a system message instead of an error #2846
- Fix not showing bounced actions when long pressing bounced message #2846
- Fix empty channel list when querying both hidden or shown channels #2865
- Allow easier customisation of the
ChatChannelListItemView
#2855
- Always use
reloadChannels()
in the Channel List to improve stability #2858
- From now on, our XCFrameworks will be built with Swift 5.7. In order to use them, you need Xcode 14 or above.
October 25, 2023
- Add
language
parameter toconnectUser()
#2847 - Expose
language
in users #2847 - Expose
originalLanguage
in messages #2847
- Add message attachment preview in the channel list #2838
- Add support for automatic translations #2847
- Enabled by
Components.default.messageAutoTranslationEnabled
- Enabled by
- Do not mark a channel as read if the app is in background #2832
- Removed
messageActionsForAlertMenu
anddeleteWithoutWarningActionItem
fromChatMessageActionsVC
#2846- This is now controlled by
ChatMessageListVC.messageActions(forDebouncedMessage:)
- This is now controlled by
October 05, 2023
- Add support for custom HTTP headers in
ChatClientConfig.urlSessionConfiguration
#2818
- Fix showing channel outside of the channel list #2819
- Fix messages not updated when user name and image change #2822
- Avoid deadlock in ConnectionRepository when timing out #2827
- Fix showing empty view when creating a new channel #2821
- Fix showing loading view for cached channels #2821
September 29, 2023
- Message parameter in adding/removing members methods #2799
- Fix thread-safety issues when connection waiters time out #2814
- Add throttling to mark as read #2808
- Improve efficiency when skipping messages #2809
- Revert message updates whenever user info changes #2810
- Improve efficiency when diffing
ChatMessage
#2811
- Fix skipping messages logic when not scrolled fully to the bottom #2809
- When there are user updates the message list won't update the authors instantly #2810
- This was recently introduced here but impacted too much the performance.
September 25, 2023
- Unread messages separator can be enabled/disabled using
components.isUnreadMessagesSeparatorEnabled
(GetStream#2797)
- Fix the unread messages banner showing on system messages #2793
- Fix compilation issues on NSEs when using Cocoapods #2798
- Fix frozen input view when editing a large message #2800
- Fix not scrolling to the caret position when typing a message and the caret is out of view #2800
- Fix not scrolling to the caret position when tapping on the shrink button #2800
- Fix composer input scrolling getting disabled on iOS 17 #2802
- Fix unread messages separator disapearing when marking channel as read #2797
September 18, 2023
- Allow injecting a custom URLSessionConfiguration in ChatClientConfig #2756
- Methods for deleting file and image in
ChatChannelController
#2776
- Fix core data warnings when logging with different user #2759
- Fix connecting user from background thread #2762
- Make the Logger thread-safe to avoid crashes #2775
- Improve
addDevice()
andremoveDevice()
with optimistic updates #2778 - Fix critical issue causing a query channel call for every new message #2781
- Added threshold for queued messages before being sent #2780
- Fix memory leak caused by
Timer.addTimeout()
#2777
- Add customization support for
ChannelListLoadingView
#2772 - Add support for disabling jumping to message animation #2770
- Fix tapping on the status bar scrolling to the bottom instead of the top #2763
- Fix empty channel header view for new DM Channels #2764
- Fix showing copy message action when text is empty #2765
- Fix link preview title covering text when image is not loaded #2773
- Fix UI Glitch in
ChannelListLoadingView
with dummy data #2772 - Fix composer input jumping when shrink button is tapped #2774
- Make record button in composer, visible depending on the channel's capabilities. #2758
- Rename
Components.chatChannelListLoadingView
->Components.channelListLoadingView
#2772
August 28, 2023
- Fix Message List not updating when user info changes #2738
- Fix Channel List items online presence not updating when user info changes #2742
- Fix Channel name not updating when member name changes #2742
- Add XCPrivacy manifest #2740
- Add digital signature to StreamChatUI XCFramework #2740
- Apply channel capabilities in UI components #2747
- Fix Channel Header View not updating when user info changes #2742
- Fix Channel List rendering user name on subtitle text in 1:1 channel #2737
- Fix gap between the composer and the keyboard when parent view’s frame origin is not zero #2743
- Change timestamp formatting in Channel List according to the default design and other SDKs #2736
August 16, 2023
- Fix video attachments not being sent with
thumb_url
, which caused issues in other platforms #2720 - Make sure loud speaker is always used for playback in voice messages #2734
- Explicitly disable channel list states for Search Components #2725
- Fix blank channel name in Message Search #2726
August 09, 2023
- Fix channel list sorting for iOS 14 and below #2719
August 08, 2023
- Add support for sorting Channel List with custom data #2701
- Fix pinning messages with attachments not synced with server #2698
- Fix messages disappearing in search query after entering a channel #2700
- Fix unread counts not updating if the channelRead information was missing from the persistence storage #2709
- Fix channel search with
autocomplete
only showing results if value started with the given query #2703
- Add Message Search UI Component #2703
- Add Channel Search UI Component #2703
- Add
Components.channelListSearchStrategy
to enable channel list search #2703
- Renames
Components.mentionAvatarView
->Components.userAvatarView
#2703 - Use Diffing to update Channel List data to improve stability #2701
July 05, 2023
- Rescue messages that are stuck in
.sending
state #2676 - Fix not being able to resend failed attachments #2680
- Fix channel list having data from a different channel list query #2684
- Add support for starting thread from oldest replies by enabling
Components.threadRepliesStartFromOldest
#2682
- Fix custom
ImageLoading
functions with default arguments not being called #2695 - Improve Channel List prefetching when loading more channels #2682
- Renamed
scrollToMostRecentMessage()
->scrollToBottom()
#2682 - Renamed
ScrollToLatestButton
->ScrollToBottomButton
#2682
June 08, 2023
- Add support for shadow banning a member #2660
- Expose
ChatChannelMember.isShadowBannedFromChannel
#2660 - Add support for passing a custom id when creating a message/reply #2667
- Fix not being able to send messages when jumping to message in newest page #2647
- Fix shadow message making hidden channel reappear #2663
- Add jumping to a reply inside a thread when tapping a quoted message which is inside a thread #2647
- Add jumping to a reply inside a thread when opening a thread from a thread reply in the channel view #2647
- Add jumping to a reply inside a thread when opening a channel from a reply as the given message around id #2647
- Add swipe to reply when
Components.default.messageSwipeToReplyEnabled
istrue
#2665 - Allow editing messages with attachments #2659
May 26, 2023
- Audio Support is now available. We added components that will allow you to record and playback audio files #2638
- Fix "to-many key not allowed here" error when using the
memberName
filter #2604 - Fix memory leak in
ChannelListController
when loading more channels #2624 - Fix
isJumpingToMessage
beingtrue
after jumping to message on the first page #2608 - Fix
noTeam
filter that was causing an error #2632 - Fix muted and joined channel list queries with empty data (Auto Filtering Enabled) #2634
- Fix user information not being updated when receiving updated information from backend #2643
- Add
Components.threadRendersParentMessageEnabled
to control whether the parent message is rendered in the Thread #2636 - Add
replaceQuery()
andreplaceChannelListController()
toChatChannelListVC
#2630 - Voice Recording attachments are here. You can now record voice messages and share them in your conversations. You can enable it by setting the
Components.default.isVoiceRecordingEnabled = true
. #2638
- Fix Composer's keyboard not adjusted when presenting alert controllers #2610
- Fix InputTextView not scrolling to caret when pasting long text #2609
- Fix scrollToBottomButton visible when jumping to message on the first page #2608
- Allow sending replies to soft-deleted parent messages #2633
- Fix an issue where attachment preview in Composer was breaking when more attachments than the
maxNumberOfVerticalItems
were added. #2638
April 25, 2023
- Add
ChatMessageController.loadPageAroundReplyId()
to load mid-page inside threads #2566
- Fix channel disappearing when channel list auto-filtering is enabled and the user is not a member of the channel #2557
- Fix an issue which was causing the app to terminate when using a filter with the
in
operator andcid
values #2561 - Fix unexpected 401s produced at launch while the chat is not yet fully connected #2559
- Fix crash when getting unread count in an invalid state #2570
- Fix crash when accessing FetchCache with an unexecuted NSFetchRequest #2572
- Fix an issue which was blocking a Guest Authentication operation to retrieve a connection token #2574
- Make connect/disconnect safer when network is offline #2571
- Make connect safer by logging out the user first if needed #2577
- Add support for bidirectional scrolling inside threads #2566
- Add support for jumping to a message which is not in the message list inside Threads #2566
- Fix the message text font when the text accessibility setting is set to large after closing the app #2575
- Fix the timestamp label being clipped when the text font size is larger #2575
When changing the text accessibility while the app is running, it won't affect the message cell text, only after closing the app. So this is a regression of #2325. This regression is necessary, since the original fix did not work 100% as it changed the text font size after closing the app, causing the font to be too big when the text accessibility is set to large. If you still want to have the dynamic font size to be working while the app is running, there is a workaround. You need to return a new UIFont
instance everytime in ChatMessageContentView.defaultMessageFont
. Example:
override var defaultMessageFont: UIFont {
UIFont.preferredFont(forTextStyle: .body)
}
For more details, you can read the documentation of ChatMessageContentView.defaultMessageFont
or read the PR #2575.
March 30, 2023
- Expose
deactivatedAt
andisDeactivated
in ChatUser #2547
- Fix channel list parsing failing completely if one channel fails parsing #2541
- Fix completion blocks not called when loading more messages #2553
- Fix
ChatChannelController
ignoring initial pagination parameter #2546
- Deprecated
ChatMessageListVC.jumpToMessage(message:)
->ChatMessageListVC.jumpToMessage(id:)
#2546 - Deprecated
ChatMessageListVCDelegate.chatMessageListVC(vc:shouldLoadPageAroundMessage:completion:)
->ChatMessageListVCDelegate.chatMessageListVC(vc:shouldLoadPageAroundMessageId:completion:)
#2546
- Allow the message list to start at the top if
Components.shouldMessagesStartAtTheTop
is enabled #2537 - Add support for jumping to message when opening channel #2546
- Add
ChatChannelVC.jumpToMessage(id:shouldHighlight)
high-level function for jumping to a message #2546
- Fix channel marking read when view is not visible #2544
March 17, 2023
- Add support for loading messages around a given message id in a Channel #2464
- Add support for bidirectional scrolling in a Channel #2464
- Fix ephemeral message disappearing after leaving channel #2464
- Fix ephemeral message appearing in channel preview #2464
- Fix issue when using
in
ornotIn
operators with auto-filtering enabled. #2531
- Deprecated
setScrollToLatestMessageButton(visible:animated:)
->updateScrollToBottomButtonVisibility(animated:)
- Replaces
messageContentViewDidTapOnQuotedMessage(_ indexPath: IndexPath?)
->messageContentViewDidTapOnQuotedMessage(_ quotedMessage: ChatMessage)
- This one is a breaking change, but a required one. The previous API was not working as intended.
- Mark as unread: Now you can mark a message as unread when you are inside a channel #2519 #2526
- Now you can easily configure your own Decorations(headers and/or footers) around messages #2507
- There is a new
ChatThreadRepliesCountDecorationView
component that should be used to display the number of replies in a thread. Read here for more details. - Add support for jumping to a quoted message #2464
- Add support for jumping to a message which is not in the message list (only channel view) #2464
- Add bidirectional scrolling in the Channel view #2464
February 28, 2023
- Remove [URLQueryItem] public conformance of ExpressibleByDictionaryLiteral #2505
- Fix messages appearing sooner in Thread pagination #2470
- Fix messages disappearing from the Message List when quoting a message #2470
- Fix Markdown formatting hanging with edge case pattern #2513
- Fix "In" Filter only returning results when all values match [#2514][GetStream#2514]
February 20, 2023
- Fix channel auto-filtering when the filter contains the
type
key #2497
- Add support for
skip_enrich_url
when sending a message #2498
February 16, 2023
- Add
UploadedAttachmentPostProcessor
inChatClientConfig
to allow changing custom attachment payloads after an attachment has been uploaded #2457 - Add
AnyAttachmentPayload(localFileURL:customPayload:)
initializer to allow creating custom attachments without a remote URL #2457 - Add skip push support when sending a message #2486
- Add support for automatically filtering channels in the Channel List #2488
- Add
isChannelAutomaticFilteringEnabled
inChatClientConfig
to allow changing whether the Channels in ChannelList will be automatically filtered #2488
- Remove unused ReactionNotificationContent #2485
- Fix channel unread count not updating when in foreground and notification extension is saving messages #2481
- Deprecates
ChatMessageGalleryView.UploadingOverlay
in favor ofUploadingOverlayView
(Renaming) #2457 - Deprecates
Components.default.imageUploadingOverlay
in favor ofComponents.default.uploadingOverlayView
(Renaming) #2457
- Fix message cell not updated when custom attachment data is different #2454
January 11, 2023
- Offline mode now only fetches the first page of the Channel List and Message List. This is a short coming right now until we support offline pagination. #2434
- Fix Channel List pagination gaps #2420
- Fix truncated channels being moved to the bottom of the channel list #2420
- Fix reactions not insantly updating when enforce unique is true #2421
- Fix not being able to delete messages in
pendingSend
state #2432 - Fix messages intermittently disappearing when first opening the channel #2434
- Fix first page not being loaded from the cache when using a lower
messagesLimit
in Channel List Query #2434 - Fix inaccuracies in for channel unread count #2433
- Add
Components.default.isUniqueReactionsEnabled
to easily configure unique reactions #2421
- Fix Reaction Picker not updating when reaction added with enforce unique #2421
January 06, 2023
- Fix UserInfo not being updated on connect #2438
December 15, 2022
logOut
anddisconnect
methods are now asynchronous. Its sync versions are deprecated #2386
- Add support for hiding connection status with
isInvisible
#2373 - Add
.withAttachments
inMessageSearchFilterScope
to filter messages with attachments only #2417 - Add
.withoutAttachments
inMessageSearchFilterScope
to filter messages without any attachments #2417 - Add retries mechanism to AuthenticationRepository #2414
- Fix connecting user with non-expiring tokens (ex: development token) #2393
- Fix crash when calling
addDevice()
from background thread #2398
- Fix message actions popup in cached thread replies #2415
November 23, 2022
- Avoid double completion calls when getting/fetching tokens #2387
November 15, 2022
channelController.uploadFile()
andchannelController.uploadImage()
are deprecated in favour ofchannelController.uploadAttachment()
#2369imageAttachmentPayload.imagePreviewURL
is deprecated since it was misleading, it was basically using the originalimageURL
#2369
- Added new
AttachmentUploader
to allow changing attachment info with custom CDN #2369
- Add timeout for token/connectionId providers so that
ChatClient.connect()
completes even in edge cases where we cannot get the needed data #2361 - Stop spamming the console with "Socket is not connected" error when token is being refreshed #2361
- Update documentation around
CurrentUserController.currentUser
to state that a non-nil value does not mean there is a valid authentication #2361 - Allow flow where
ChatClient.setToken()
is called beforeChatClient.connect()
#2361 - Properly recover from a missing/expired token on the first execution of
TokenProvider
#2361 - Fix data races created by
AsyncOperation
looped execution when refreshing tokens #2361
- Fix issue where cell content would not be updated when order changes in Channel List #2371
October 27, 2022
- Fix CurrentChatUserController+Combine initialValue hard coded to
.noUnread
instead of using the initial value from the current user data model #2334 - Allow Message Search pagination when using sort parameters #2347
- Fix TokenProvider sometimes being invoked two times when token is expired #2337
- Uses Stream's Image CDN v2 to reduce the memory footprint #2339
- Make ChatMessageListVC.tableView(heightForRowAt:) open #2342
- Fix message text not dynamically scalable with content size category changes #2328
Although we don't usually ship breaking changes in minor releases, in some cases where they are minimal and important, we have to do them to keep improving the SDK long-term. Either way, these changes are for advanced customizations which won't affect most of the customers.
- The
ImageCDN
protocol has some minor breaking changes that were needed to support the new Stream CDN v2 and to make it more scalable in the future.urlRequest(forImage:)
->urlRequest(forImageUrl:resize:)
.cachingKey(forImage:)
->cachingKey(forImageUrl:)
.- Removed
thumbnail(originalURL:preferreSize:)
. This is now handled byurlRequest(forImageUrl:resize:)
as well. If your CDN does not support resizing, you can ignore the resize parameter.
September 26, 2022
- Added
timeoutIntervalForRequest
to ChatClientConfig to control URLSession's timeout #2311 - Added
channel.ownCapabilities
#2317
- Fixed pagination in message list not working when synchronize does not succeed #2241
- Do not mark channels as read when the controller is not on screen #2288
- Do not show old messages not belonging to the history when paginating #2298). Caveat: Explained here
- Fix logic to determine errors related to connectivity #2311
- Stop logging false positive errors for 'channel.created' events #2314
- Properly handle Global Ban events #2312
- Highlighted user mentions support #2253
- New
ChatMessageListRouter.showUser()
to easily provide a custom profile view when user clicks on an avatar or user mention #2253
- User mentions suggestions would not show when typing in a new line #2253
- User mentions suggestions would stop showing when typing a space #2253
- Fix Thread not loading more replies #2297
- Fix Channel and Thread pagination not working when initialized offline #2297
September 19, 2022
- Fix Message List cell not updating when an existing reaction of the same type was updated from the current user #2304
- Fix Message List cell not updating when the number of reactions of the same type changed #2304
September 06, 2022
- Fix message list crash when inserting message in empty list on iOS <15 #2269
September 01, 2022
🚨 Known Issue: There is a crash on iOS <15 when inserting messages in an empty list, please update to 4.21.1
- From now on, if you want to logout the user from the app, especially when switching users, you should call the
client.logout()
method instead ofclient.disconnect()
. Read more here #2241
- Fix hidden channels showing past history #2216
- Fix token not being refreshed because of parsing error #2248
- Fix deadlock caused by ListDatabaseObserver.startObserving() changes #2252
- Fix parsing
member
field innotification.removed_from_channel
event #2259 - Fix broken pagination when quoting or pinning old messages #2258
- New Message List Diffing Implementation #2226
_messageListDiffingEnabled
flag has been removed #2226
- Fix jumps in Message List #2226
- Fix image flickers when adding image attachment to a message #2226
- Fix message list scrolling when popping from navigation stack #2239
- Fix message timestamp not appearing after hard deleting the last message in the group #2226
August 02, 2022
- Support for message moderation (NNBB) #2103
- Fix crash in ListDatabaseObserver.startObserving() #2177
- Make BaseOperation thread safe #2198
- Fix build issues in Xcode 14 beta #2202
- Improve consistency when retrieving Message after Push Notification #2200
- Make sure ChannelDTO is still valid when accessing Lazy blocks #2204
- Add channel list states; empty, error and loading views #2187
- Support for message moderation (NNBB) #2103
July 21, 2022
- Add hide history option when adding a new member #2155
- Add Extra Data Usage Improvements #2174
- For more details please read the documentation here.
- Avoid triggering CoreData updates in willSave() #2156
- Sync active channels when no channel list #2163
- Fix Channel missing messages from NSE push updates #2166
July 05, 2022
- Added missing
ChannelListFilterScope
andMemberListFilterScope
filter keys #2119
- Improved performance when saving big payloads (by 50% in some edge cases)#2113
- Chat SDK now leverages
chat.stream-io-api.com
endpoint by default #2125 - JSON decoding performance is futher increased, parsing time reduced by another %50 #2128
- Better errors in case JSON decoding fails #2126
- File upload size limit is increased to 100MB #2136
- Allow sending giphy messages programmatically #2124
- JSON decoding is now more robust, single incomplete/broken object won't disable whole channel list #2126
- Allow scroll automatically to the bottom when sending a giphy from the middle of the message list #2130
June 22, 2022
parentMessageId
parameter for typing events #2080- Adds support for multi bundle push notifications #2101
- Fix hidden channels not appearing on relaunch #2056
- Fix
channel.hidden
event failing to decode on launch/reconnection #2056 - Fix messages in hidden channels with
clearHistory
re-appearing #2056 - Fix last message of hidden channel with
clearHistory
visible in channel list #2056 - Message action title now supports displaying 2 lines of text instead of 1 #2082
- Fix Logger persisting config after usage, preventing changing parameters (such as LogLevel) #2081
- Fix crash in
ChannelVC
when it's initialized using aChannelController
created withcreateDirectMessageChannelWith
factory #2097 - Fix
ChannelListSortingKey.unreadCount
causing database crash #2094 - Fix attachment link previews with missing URL scheme not opening in browser #2106
- JSON decoding performance is increased 3 times, parsing time reduced by %70 #2081
- EventPayload decoding errors are now more verbose #2099
- Fix Logger persisting config after usage, preventing changing parameters (such as LogLevel) #2081
June 10, 2022
- The
tokenProvider
property was removed fromChatClient
#2031
- Make it possible to call
ChatClient.connect
with atokenProvider
#2031
- Saving payloads to local database is now 50% faster. Initial launch and displaying channel list should be noticeably faster #1973
- Fix not waiting for last batch of events to be processed when connecting as another user #2016
- Fix
Date._unconditionallyBridgeFromObjectiveC(NSDate?)
crash #2027 - Fix
NSHashTable
count underflow crash #2032 - Fix crash when participant hard deletes a message 2075
- Fix possible deadlock in
CurrentUserController
functions being called from background threads #2074 - Fix using incorrect index path for updates #2044
- Changing the decoding of
role
tochannel_role
asrole
is now deprecated on the backend. This allows for custom roles defined within your V2 permissions #2028
- Add Support for Slow Mode #1953
- Present channel screen modally when channel list in not embedded by navigation controller #2011
- Show channel screen as right detail when channel list is embedded by split view controller #2011
- Fix DM Channel with multiple members displaying only 1 user avatar #2019
- Improve stability of Message List with Diffing disabled #2006 #2076
- Fix quoted message extra spacing jump UI glitch #2050
- Fix edge case where cell would be hidden after reacting to it #2053
June 01, 2022
This release does not contain any code changes.
- Provides new
SPI
config. - Adds swift docc plugin to package dependencies.
June 01, 2022
This release does not contain any code changes.
- Provides new
SPI
config. - Adds swift docc plugin to package dependencies.
June 01, 2022
This release does not contain any code changes.
- Provides new
SPI
config. - Adds swift docc plugin to package dependencies.
May 11, 2022
- Expose
readBy/readByCount
onChatMessage
containing info about users who has seen this message. These fields are populated only for messages sent by the current user #1887 - Expose preview message on
ChatChannel
#1935
- Fix unread messages count bumping logic #1978
- respect muted channels
- respect muted users
- decrement when message is hard deleted
- Fix paginated channels in channel list were left without messages when sync is executed #1985
- Fix
deletedMessagesVisibility == .alwaysVisible
shows deleted ephemeral messages in message list #1991 - Fix disappearing messages when uploading an attachment and reentering the channel #2000
- Rename
mentionedMessages
tomentions
inChannelUnreadCount
#1978 - Changes
.team
filterFilterKey
to acceptnil
as a parameter #1968
- Deprecate
ChatMessage.isOnlyVisibleForCurrentUser
as it does not account deleted messages visability setting #1948 - Rename components related to message footnote content in
ChatMessageContentView
#1948
- Show delivery status indicator for messages sent by the current user #1887
- Show delivery status indicator for messages sent by the current user in channel preview #1935
- Add support for custom reactions sorting #1944
- Add
nonEmpty
filter for channel list query #1960
- Fix
onlyVisibleForYouIndicator
not being shown for ephemeral messages #1948 - Fix message popup UI glitch for bigger messages and iPad/Landscape #1975
- Fix footnote being hidden for the message followed by
ephemeral
message #1956 - Fix footnote being hidden for the message followed by
system
message #1956
April 26, 2022
quotesEnabled
property is added to theChannelConfig
#1891
- Assertions are no longer thrown by default. Check
StreamRuntimeCheck
to enable them #1885 - Local Storage is enabled by default. You can read more here #1890
- Mark all read has been relocated to
CurrentUserController
to have parity with other platforms #1927 - New
CurrentUserController.addDevice(_pushDevice:)
replacesCurrentUserController.addDevice(token:pushProvider:)
#1934- How to use the new addDevice API:
currentUserController.addDevice(.apn(token: apnDeviceToken))
- How to use the new addDevice API:
- Fix support for multiple active channel lists at the same time #1879
- Fix channels linked to the channel list not being watched #1924
- Fix connection recovery flow being triggered after the first connection #1925
- Fix connection recovery flow not being cancelled on disconnect #1925
- Fix cooldown being applied to /sync endpoint in connection recovery flow #1925
- Fix active components not being reset when another user is connected #1925
- Fix unusable firebase push provider #1934
- Fix DB errors happening when logging in after a logout / user switch #1926
- The
toVCSnapshot
,fromVCSnapshot
andcontainerTransitionImageView
properties were removedZoomAnimator
because they were the root cause of animation issues when presenting the popup actions #1899
- The time interval between 2 messages so they are grouped in the UI is changed from
30 sec
to60 sec
#1893
- Quote message action visibility can be controlled from the dashboard #1891
- Fix full screen live photos weird flicker when presented / dismissed to / from full screen #1899
- Timestamp not being shown for the message when the next message is error #1893
- Another user's avatar not being shown for deleted message last in a group #1893
- Fix audio files not rendering previews #1907
- Fix message sender name is not shown in channel with > 2 members if member identifiers were passed on channel creation #1931
- Fix incorrectly called viewWillAppear inside viewWillDissapear #1938
April 04, 2022
- Fix deadlock when accessing some properties from Events Delegate #1898
March 29, 2022
- Introduce message translations. See docs for more info #1867
- Add support for multiple push providers #1864
- Fix payload for reaction when using
enforce_unique
#1861 - Use IndexPath's item instead of row for macOS compatibility #1859
- Fix mime-type for file attachments #1873
- Properly decode
removed_from_channel
event when channel is incomplete #1881
AttachmentsPreviewVC
contains significant deprecations #1877
- Add Mixed Attachments UI Support #1877
- Resolve attachment type when importing file from file picker #1873
- Fix long file names overlapped by the close button #1880
- Fix long file names being truncated at the end instead of the middle #1880
- Fix commands without arguments cannot be sent without text #1869
- Fix pasting long text into composer won't update input height #1875
March 16, 2022
- Add Offline Support (Connection & events recovery, and offline actions queuing) #1831
- Add
MessageSearchSortingKey.createdAt
andupdatedAt
for sorting options #1824
- Fix
ChatMessageSearchController
not respectingsort
param #1824 - Fix
ChatMessageSearchController
not removing old search results #1824 - Fix
ChatMessageSearchController
making empty searches #1824
⚠️ Change default message deleted visibility to.alwaysVisible
#1851- Note: This change is required to be align with the other SDK Platforms. If you still want the older behaviour, you should set the
ChatClientConfig.deletedMessagesVisibility
to.visibleForCurrentUser
.
- Note: This change is required to be align with the other SDK Platforms. If you still want the older behaviour, you should set the
- Make it possible to customize the message view only in the popup actions #1844
- Fix blurred avatar views when using image merger #1841
- Fix "Only visible to you" shown when deleted messages visible for all users #1847
- Fix channels list cell staying as selected when in Airplane mode #1831
March 01, 2022
- Add Support for Message List Data Source Diffing (Experimental) #1770
- Show Camera option on the ComposerVC #1798
ChannelController
'struncateChannel
function now allows you to specifysystemMessage
,hardDelete
,skipPush
properties #1799- Added
truncatedAt
property toChatChannel
- Added increased logging for CoreData crashes caused by lingering models from previous sessions #1814
- Fix
ChatMentionSuggestionView
permanently hiding subviews #1800 - Fix showing channel watchers in mention suggestions list #1803
- System message is now properly shown when channel is truncated #1799
- Fix Memory Leaks when opening and closing channels #1812
February 16, 2022
ChannelListVC
now keeps track of channels where user is a member only instead of all channels loaded in the SDK. #1785
- Make SendButton animation overridable #1781
- Make ChannelId.rawValue public #1780
- Fix channel not removed from channel list when user leaves the channel #1785
- Fix
ChannelListController.loadNextChannels
using incorrectlimit
when argument is omitted #1786 - Fix Message Input Accessibility for Large Text #1787
- Fix crash on iOS 12 when local storage enabled #1784
February 01, 2022
- In case you are presenting the
ChatChannelVC
in a modal, you should now be using theStreamModalTransitioningDelegate
. The workaround to fix the message list being dismissed when scrolling to the bottom has been removed in favor of the custom modal transition. Please check the following PR description to see how to use it: #1760
- Add custom modal transition for message list #1760
- Fix composer not showing any files when >3 files are selected in bulk #1768
- Crashfix for hanging
DispatchWorkItem
reference inWebSocketClient
#1766
January 18, 2022
- Add hard delete messages support #1745
- Fix wrong image resolution when images are being quoted #1747
- Fix message list NSInternalInconsistencyException crash #1752
- Fix Image and Video sharing behaviour #1753
January 4, 2022
- Add support to paginate messages pinned in a channel #1741
notification.channel_deleted
events are now handled by the SDK #1737MemberListController
receives new members correctly #1736ChatChannel.membership
is correctly reflected in all cases #1736
December 28, 2021
ChannelListQuery.membersLimit
param for controlling the number of members returned for each channel #1721- Adds support to pass extra data for message from
ComposerVC
#1722
- Fix multiple pagination requests being fired from
ChatChannelVC
andChatChannelListVC
#1706 - Fix rendering unavailable reactions on
ChatMessageReactionAuthorsVC
#1719 - Fix unncessary API calls performed when loading threads #1716
- Fix quoted messages not updated after edit #1703
- Fix deleted replies being shown in channel #1707
- Fix Date._unconditionallyBridgeFromObjectiveC crashes #1646
December 20, 2021
- Dependencies are no longer exposed (this includes Nuke, SwiftyGif and Starscream). If you were using those dependencies we were exposing, you would need to import them manually. This is due to our newest addition supporting Module Stable XCFrameworks, see more below in the "Added" section.
- Change
ChatMessageLayoutOptions
to aSet
instead of anOptionSet
for a more flexible and safer customization #1651 - There is a new
ChatMessageListDateSeparatorView
component that should be used instead of theChatMessageListScrollOverlayView
if the goal is customize the styling of the date separator. Read here for more details. UnknownEvent
is now deprecated, useUnknownChannelEvent
orUnknownUserEvent
instead. #1695.- SwiftyGif now points to v5.4.2 that resolves crash related to leaked delegate reference.
- Fix
stopTyping
can be called onTypingEventSender
after callingstartTyping
#1649. - Reactions no longer cover the text in message bubble #1666.
- Fix
error
type messages rendered as user's messages and interactive #1672. - Fix
ChannelListController
makes one redundant API call #1687. - Safely access indexes of collections #1692.
- Add support for pre-built XCFrameworks #1665.
- Added
LogConfig.destinationTypes
for ease of adding new destinations to logger #1681. - Expose container embedding top & bottom containers by
ChatChannelListItemView
#1670. - Add Static Message List Date Separators #1686 (You can read this doc to understand how to configure this feature).
- Adds
UnknownUserEvent
that models custom user event #1695. ChannelQuery.options
andChannelListQuery.options
are now public and mutable #1696ChannelController.startWatching
andstopWatching
are nowpublic
. You can explicitly stop watching a channel #1696.
December 10, 2021
- Fix regression for reactions left by the current user being not accurate #1680
December 01, 2021
- Fix memory leak in GalleryVC #1631
- Increase tappable area surrounding the ShareButton inside the GalleryVC #1640
- Fix giphy action message (ephemeral message) in a thread is also shown in the channel #1641
- Fix crash when sending giphies. (Requires update of SwiftyGif to 5.4.1) SwiftyGif#158
- Improve stability of marking channel read #1656
- Make
LogDetails
fieldspublic
so they are be accessible. Typical usage is when overridingprocess(logDetails:)
when subclassingBaseLogDestination
#1650
November 16, 2021
- Fix message list scrolling jumps when a new message is received #1605
- Fix message cell not resized after editing a message with bigger/smaller content #1605
- Improve send button tap responsiveness #1626
- Dismiss suggestions popup when tapping outside #1627
- Optimistic Reaction UI, adding/removing reactions can be done offline and API calls are performed asynchronously #1592
- Automatically retry failed API calls for adding and removing reactions #1592
November 11, 2021
- Using Xcode 13 & CocoaPods should load all the required assets. #1602
- Make the NukeImageLoader initialiser accessible #1600
- Fix message not pinned when there is no expiration date #1603
- Fix uploaded videos' mime types were not encoded correctly #1604
- Added a new
make
API within our ChatChannelListVC so it's easier to instantiate, this eliminates the need to setup within the ViewController lifecycle #1597 - Add view to show all reactions of a message when tapping reactions #1582
November 03, 2021
flag
command is no longer visible on Composer #1590- Fix long-pressed message being swapped with newly received message if both have the same visual style #1596
- Fix crash when message actions pop-up is dismissed with the selected message being outside the visible area of message list #1596
- The message action icons were changed to be a bit more darker color #1583
- The long-pressed message view is no longer moved across
ChatMessageListVC
andChatMessagePopupVC
hierarchies #1596
- Added Flag message action #1583
- Added handling of "shadowed" messages (messages from shadow banned users). The behavior is controlled by
ChatClientConfig.shouldShowShadowedMessages
and defaults tofalse
. #1591 - Add message actions transition controller to
Components
#1596
October 26, 2021
LogConfig.subsystems
for customizing subsysems where logger should be active #1522ChannelListController
can now correctly give a list of hidden channels #1529ChatChannel.isHidden
is now exposed #1529- Add
name
sort option for member list queries #1576 - Update
ComposerVC
to respect API limitation and show an alert when > 10 attachments are added to the message. #1579
- Fix incorrect key in
created_by
filter used in channel list query #1544 - Fix message list jumps when new reaction added #1542
- Fix message list jumps when message received #1542
- Fix broken constraint in the
ComposerView
, we have made theBottomContainer
a standardUIStackView
#1545 - Fix whitespace when dismissing Gallery Image by using the PanGesture. This now displays keyboard as required #1563
- Fix
ChannelListSortingKey.hasUnread
causing a crash when used #1561 - Fix Logger not logging when custom
subsystem
is specified #1559 - Fix channel not updated when a member is removed #1560
- Fix channel mark read #1569
- Fix lowercased username was used for mention instead of original name #1575
LogConfig
changes after logger was used will now take affect #1522setDelegate(delegate:)
is now deprecated in favor of using thedelegate
property directly #1564
October 12, 2021
- Fixes left buttons not being hidden when a command was added in the composer #1528
- Fixes attachments not being cleared when a command was added #1528
- Fix
imageURL
is incorrectly encoded asimage_url
duringconnectUser
#1523 - Fix fallback to
Components.default
because of responder chain being broken inChatChannelVC/ChatThreadVC/ChatMessageCell
#1519 - Fix crash after
ChatClient
disconnection #1532 - Fix when sending a new message UI flickers #1536
- Fix crash on
GalleryVC
happening on iPad when share button is clicked #1537 - Fix pending API requests being cancelled when client is connecting for the first time #1538
- Make it possible to customize video asset (e.g. include custom HTTP header) before it's preview/content is loaded #1510
- Make it possible to search for messages containing attachments of the given types #1525
- Make
ChatReactionsBubbleView
open for UI customization #1526
- Rename
VideoPreviewLoader
type toVideoLoading
andvideoPreviewLoader
tovideoLoader
inComponents
#1510 - Changes
ComposerVC.Content.command
tolet
instead ofvar
and introducesComposerVC.content.addCommand
to add commands to a message for a safer approach #1528
October 06, 2021
- Fix keyboard showing over composer #1506
- Safely unwrap images to prevent crashes on images from bundle #1502
- Fixed when a channel list query has no channels, any future channels are not added to the controller #1513
- Take
VideoAttachmentGalleryCell
andImageAttachmentGalleryCell
types used inGalleryVC
fromComponents
#1509
October 01, 2021
- Events expose chat models (e.g.
channel: ChatChannel
) instead of just IDs #1081 - SDK is now Carthage compatible #1495
- Dynamic height for the composer attachment previews #1480
- Fix
shouldAddNewChannelToList
andshouldListUpdatedChannel
delegate funcs are not overridable in ChannelListVC subclasses #1497 - Make messageComposerBottomConstraint public #1501
- Fix
ChatChannelListVC
showing channels muted by the current user when defaultshouldAddNewChannelToList/shouldListUpdatedChannel
delegate method implementations are used #1476
September 24, 2021
- Introduce
ChannelController.uploadFile
function for uploading files to CDN to obtain a remote URL #1468
- Fix channel unread counts, thread replies and silent messages do not increase the count anymore #1472
- Fix token expiration refresh mechanism for API endpoints #1446
- Fix keyboard handling when navigation bar or tab bar are not translucent #1470 #1464
- Attachments types are now
Hashable
1469
September 17, 2021
- Introduce
shouldAddNewChannelToList
andshouldListUpdatedChannel
delegate callbacks toChannelListController
. With these, one can list/unlist new/updated channels to the existing controller. #1438 #1460 - Added injection of
ChatMessageReactionsBubbleView
toComponents
, so customers will be able to subclass and customise it. #1451 - Add delegate func for tap on user avatar for a message #1453
CurrentUser.currentDevice
is alwaysnil
. Now it won't be nil afteraddDevice
is called #1457
- Update
ChatClient
to disconnect immediately when the Internet connection disappears #1449 NewChannelQueryUpdater
, which takes care of listing/unlisting new/updated channels, is disabled. We recommend using the newChannelListController
delegate methodsshouldAddNewChannelToList
andshouldListUpdatedChannel
#1460
- Fix message list wrong content inset when typing events disabled #1455
- Fix message list unwanted scrolling when typing indicator shown #1456
- Fix typing events always disabled when channel opened without cache from Channel List #1458
- Fix hypens (-) are not allowed in custom channel types #1461
September 10, 2021
September 09, 2021
- Fix channel list showing outdated data, and channels not showing any messages after reconnection #1435
September 03, 2021
- JSON Encoding/Decoding for both Network and Database date formatting changed to RFC3339 formats #1403
ChatMessage.threadParticipants
is now an Array instead of Set #1398- Introduces
ChatChannelVC
and removes responsibilities ofChatMessageListVC
. The latter now is only responsible to render the message list layout, the data is provided byChatChannelVC
orChatThreadVC
. #1314 - Replaces
ChatMessageActionsVC.Delegate
withChatMessageActionsVCDelegate
#1314 - Renames
ChatChannelListRouter.showMessageList()
->showChannel()
#1314 - Removal of
ComposerVCDelegate
#1314 - Replaces
ChatMessageListKeyboardObserver
withComposerKeyboardHandler
#1314
-
ChatChannelVC
:ChatChannelHeaderView
ChatMessageListVC
ComposerVC
-
ChatThreadVC
:ChatThreadHeaderView
ChatMessageListVC
ComposerVC
A new ChatChannelVC
is introduced that represents the old ChatMessageListVC
, which was responsible to display the messages from a channel. The ChatThreadVC
remains the same and it is responsible for displaying the replies in a thread, but now instead of duplicating the implementation from the channel, both use the ChatMessageListVC
and configure it for their needs. For this to be possible the ChatMessageListVC
has now a ChatMessageListVCDataSource
and ChatMessageListVCDelegate
. Both ChatChannelVC
and ChatThreadVC
implement the ChatMessageListVCDataSource
and ChatMessageListVCDelegate
.
- Nuke dependency was updated to v10 #1405
- For non-DM channels, the avatar is now shown as a combination of the avatars of the last active members of the channel #1344
- New DateFormatter methods
rfc3339Date
andrfc3339DateString
#1403 - Add a new
isMentionsEnabled
flag to make it easier to disable the user mentions in the ComposerVC #1416 - Use remote config to disable mute actions #1418
- Use remote config to disable thread info from message options #1418
- Provide different Objc name for InputTextView #1420
- Add message search support through
MessageSearchController
#1426
- Fix incorrect RawJSON number handling, the
.integer
case is no longer supported and is replaced by.number
#1375 - Fix message list and thread index out of range issue on
tableView(_:cellForRowAt:)
#1373 - Fix crash when dismissing gallery images #1383
- Improve pagination efficiency #1381
- Fix user mention suggestions not showing all members #1390
- Fix thread avatar view not displaying latest reply author avatar #1398
- Fix crash on incorrect date string parsing #1403
- Fix threads not showing all the responses if there were responses that were also sent to the channel #1413
- Fix crash when accessing
ChatMessage.attachmentCounts
on <iOS13 with in-memory storage turned ON - Fix
isCommandsEnabled
not disabling the typing commands #1416 - Fix mention suggester now supports
options.minimumRequiredCharacters
equal to 0 and sorts results with same score consistently - Fix filters with wrong Date encoding strategy #1420
- Fix message height is now calculated correctly when a message is updated #1424
- Fix
ChatMessageReactionData.init
not public #1425
August 13, 2021
- Fix jumps when presenting message popup actions in a modal #1361
- Fix custom Channel Types not allowing uppercase letters #1361
- Fix
ChatMessageGalleryView.ImagePreview
not compiling in Obj-c #1363 - Fix force unwrap crashes on unknown user roles cases #1365
- Fix "last seen at" representation to use other units other than minutes #1368
- Fix message list dismissing on a modal when scrolling #1364
- Fix crash on channel delete event #1408
August 11, 2021
- New
ChannelListSortingKey
sunreadCount
andhasUnread
#1348 - Added
GalleryAttachmentViewInjector.galleryViewAspectRatio
to control the aspect ratio of a gallery inside a message cell #1300
ChatMessageReactionsVC.toggleReaction
is nowopen
#1348- User mentions now fetch suggestions from current channel instead of doing a user search query. Set
Components.mentionAllAppUsers
to true if you want to perform user search instead #1357
- Fix
ChannelListController.synchronize
completion closure not being called when the client is connected #1353 - Selecting suggestions from Composer did not work correctly #1352
- Fixed race condition on
ChatMessageListVC
andChatThreadVC
that causedUITableView
crashes #1347 - Fixed an issue for
ChatThreadVC
opened from a deeplink when new replies are only added to the chat, but not to the replies thread #1354
August 05, 2021
- Extra data is now stored on a hashmap and not using the
ExtraData
generic system ChatMessageLayoutOptionsResolver.optionsForMessage
has a new parameter:appearance
#1304- Renamed
Components.navigationTitleView
->Components.titleContainerView
#1294
The new 4.0
release changes how extraData
is stored and uses a simpler hashmap-based solution. This approach does not require creating type aliases for all generic classes such as ChatClient
.
Example:
client.connectUser(
userInfo: .init(
id: userCredentials.id,
extraData: ["country": .string("NL")]
),
token: token
)
Message
, User
, Channel
, MessageReaction
models now store extraData
in a [String: RawJSON]
container.
let extraData:[String: RawJSON] = .dictionary([
"name": .string(testPayload.name),
"number": .integer(testPayload.number)
])
If you are using ExtraData
from v3
or before 4.0-beta.8
the steps needed to upgrade are the following:
- Remove all type aliases (
typealias ChatUser = _ChatUser<CustomExtraDataTypes.User>
) - Replace all generic types from
StreamChat
andStreamChatUI
classes (__CurrentChatUserController<T>
->CurrentChatUserController
) with the non-generic version - Remove the extra data structs and either use
extraData
directly or (recommended) extend the models - Update your views to read your custom fields from the
extraData
field
Before:
struct Birthland: UserExtraData {
static var defaultValue = Birthland(birthLand: "")
let birthLand: String
}
After:
extension ChatUser {
static let birthLandFieldName = "birthLand"
var birthLand: String {
guard let v = extraData[ChatUser.birthLandFieldName] else {
return ""
}
guard case let .string(birthLand) = v else {
return ""
}
return birthLand
}
}
- Added
ChatChannelHeaderView
UI Component #1294 - Added
ChatThreadHeaderView
UI Component #1294 - Added custom channel events support #1309
- Added
ChatMessageAudioAttachment
, you can access them viaChatMessage.audioAttachments
. There's no UI support as of now, it's in our Roadmap. #1322 - Added message ordering parameter to all
ChannelController
initializers. If you useChatChannelListRouter
it can be done by overriding ashowMessageList
method on it. #1338 - Added support for custom localization of components in framework #1330
- Fix message list header displaying incorrectly the online status for the current user instead of the other one #1294
- Fix deleted last message's appearance on channels list #1318
- Fix reaction bubbles sometimes not being aligned to bubble on short incoming message #1320
- Fix hiding already hidden channels not working #1327
- Fix compilation for Xcode 13 beta 3 where SDK could not compile because of unvailability of
UIApplication.shared
#1333 - Fix member removed from a Channel is still present is MemberListController.members #1323
- Fix composer input field height for long text #1335
- Fix creating direct messaging channels creates CoreData misuse #1337
ContainerStackView
doesn'tassert
when trying to remove a subview, these operations are now no-op #1328ChatClientConfig
'sisLocalStorageEnabled
's default value is nowfalse
/sync
endpoint calls optimized for a setup when local caching is disabled i.e.isLocalStorageEnabled
is set to false.
July 21, 2021
urlRequest(forImage url:)
added toImageCDN
protocol, this can be used to inject custom HTTP headers into image loading requests #1291- Functionality that allows inviting users to channels with subsequent acceptance or rejection on their part #1276
EventsController
which exposes event observing API #1266
- Fix an issue where member role sent from backend was not recognized by the SDK #1288
- Fix crash in
ChannelListUpdater
caused by the lifetime not aligned withChatClient
#1289 - Fix composer allowing sending whitespace only messages #1293
- Fix a crash that would occur on deleting a message #1298
July 19, 2021
- The
ChatSuggestionsViewController
was renamed toChatSuggestionsVC
to follow the same pattern across the codebase. #1195
- Changed Channel from
currentlyTypingMembers: Set<ChatChannelMember>
tocurrentlyTypingUsers: Set<ChatUser>
to show all typing users (not only channel members; eg: watching users) #1254
- Fix deleted messages appearance #1267
- Fix composer commands and attachment buttons not shown in first render when channel is not in cache #1277
- Fix appearance of only-emoji messages #1272
- Fix the appearance of system messages #1281
- Fix a crash happening during MessageList updates #1286
- Support for pasting images into the composer #1258
- The visibility of deleted messages is now configurable using
ChatClientConfig.deletedMessagesVisibility
. You can choose from the following options #1269:
/// All deleted messages are always hidden.
case alwaysHidden
/// Deleted message by current user are visible, other deleted messages are hidden.
case visibleForCurrentUser
/// Deleted messages are always visible.
case alwaysVisible
- Fix crash when scrolling to bottom after sending the first message #1262
- Fix crash when thread root message is not loaded when thread is opened #1263
- Fix issue when messages were changing their sizes when channel is opened #1260
- Fix over fetching previous messages #1110
- Fix an issue where multiple messages in a channel could not quote a single message #1264
- The way attachment view stretches the message cell to fill all available width. Now it's done via
fillAllAvailableWidth
exposed on base attachment injector (set totrue
by default) #1260
July 08, 2021
- Fix issue where badge with unread count could remain visible with 0 value #1259
- Fixed the issue when
ChatClientUpdater.connect
was triggered before the connection was established due to firing.didBecomeActive
notification #1256
July 07, 2021
-
The
ChatSuggestionsViewController
was renamed toChatSuggestionsVC
to follow the rest of the codebase. #1195 -
The
CreateChatChannelButton
component was removed. The component acted only as a placeholder and the functionality should be always provided by the hosting app. For an example implementation see the Demo app. -
The payload of
AnyChatMessageAttachment
changed fromAny
toData
#1248. -
The user setting API was updated. It's now required to call one of the available
connect
methods onChatClient
afterChatClient
's instance is created in order to establish connection and set the current user.If you were doing:
let client = ChatClient(config: config, tokenProvider: .static(token))
Now you should do:
let client = ChatClient(config: config) client.connectUser(userInfo: .init(id: userId), token: token)
Guest users before:
let client = ChatClient( config: config, tokenProvider: .guest( userId: userId, name: userName ) )
Now you should do:
let client = ChatClient(config: config) client.connectGuestUser(userInfo: .init(id: userId))
Anonymous users before:
let client = ChatClient(config: config, tokenProvider: .anonymous)
Now you should do:
let client = ChatClient(config: config) client.connectAnonymousUser()
If you use tokens that expire you probably do something like this:
let client = ChatClient( config: config, tokenProvider: .closure { client, completion in service.fetchToken { token in completion(token) } } )
Now you should do:
let client = ChatClient(config: config) service.fetchToken { token in client.connectUser(userInfo: .init(id: userId), token: token) } // `tokenProvider` property is used to reobtain a new token in case if the current one is expired client.tokenProvider = { completion in service.fetchToken { token in completion(token) } }
search(query:)
function toUserSearchController
to make a custom search with a query #1206queryForMentionSuggestionsSearch(typingMention:)
function toComposerVC
, users can override this function to customize mention search behavior #1206.contains
added toFilter
to be able to filter forteams
#1206
shouldConnectAutomatically
setting inChatConfig
, it now has no effect and all logic that used it now behaves like it was set totrue
.
ConnectionController
fires itscontrollerDidChangeConnectionStatus
method only when the connection status actually changes #1207- Fix cancelled ephemeral (giphy) messages and deleted messages are visible in threads #1238
- Fix crash on missing
cid
value ofMessage
during local cache invalidation #1245 - Messages keep correct order if the local device time is different from the server time #1246
June 23, 2021
ChatOnlineIndicatorView
renamed toOnlineIndicatorView
GalleryContentViewDelegate
methods updated to have optional index pathFileActionContentViewDelegate
methods updated to have optional index pathLinkPreviewViewDelegate
methods updated to have optional index pathscrollToLatestMessageButton
type changed fromUIButton
to_ScrollToLatestMessageButton<ExtraData>
UITableView
is now used instead ofUICollectionView
to display the message list #1219ChatMessageImageGallery
renamed toChatMessageGalleryView
, updated to show any contentImageGalleryVC
renamed toGalleryVC
ImagePreviewable
renamed toGalleryItemPreview
, updated to exposeAttachmentId
onlyGalleryContentViewDelegate
methods are renamed to work not only for image attachment but for anyselectedAttachmentType
removed fromComposerVC
imagePickerVC
renamed tomediaPickerVC
inComposerVC
- Video attachments support:
VideoAttachmentPayload
type is introduced, video attachments are exposed onChatMessage
VideoAttachmentComposerView
component is added to displaying video thumbnails inComposerVC
VideoAttachmentCellView
displaying video previews inChatMessageImageGallery
VideoCollectionViewCell
displaying videos inGalleryVC
VideoPlaybackControlView
used to take actions on the playing video inGalleryVC
VideoPreviewLoader
loading video thumbnails For more information, see #1194mentionText(for:)
function added toComposerVC
for customizing the text displayed for mentions #1188 #1000score
toChatMessageReactionData
so a slack-like reaction view is achievable. This would be used as content inChatMessageReactionsView
#1200- Ability to send silent messages. Silent messages are normal messages with an additional
isSilent
value set totrue
. Silent messages don’t trigger push notification for the recipient.#1211 - Expose
cid
onMessage
#1215 showMediaPicker
/showFilePicker
/attachmentsPickerActions
functions added toComposerVC
so it's possible to customize media/document pickers and add extend action sheet with actions for custom attachment types #1194- Make
ChatThreadVC
show overlay with timestamp of currently visible messages when scrolling #1235 - Expose
layoutOptions
onChatMessageContentView
#1241
scrollToLatestMessageButton
is now visible every time the last message is not visible. Not only when there is unread message. #1208mediaPickerVC
inComposerVC
updated to show both photos and videos #1194ChatMessageListScrollOverlayView
moved outside theChatMessageListView
. Now it's managed byChatMessageListVC
andChatThreadVC
explicitly #1235- Date formatter for scroll overlay used in
ChatMessageListVC
is now exposed asDateFormatter.messageListDateOverlay
#1235
- Fix sorting Member List by
createdAt
causing an issue #1185 - Fix ComposerView not respecting `ChannelConfig.maxMessageLength #1190
- Fix mentions not being parsed correctly #1188
- Fix layout feedback loop for Quoted Message without bubble view #1203
- Fix image/file/link/giphy actions not being handled in
ChatThreadVC
#1207 - Fix
ChatMessageLinkPreviewView
not being taken fromComponents
#1207 - Subviews of
ChatMessageDefaultReactionsBubbleView
are now public #1209 - Fix composer overlapping last message. This happened for channels with typing events disabled. #1210
- Fix an issue where composer textView's caret jumps to the end of input #1117
- Fix deadlock in Controllers when
synchronize
is called in a delegate callback #1214 - Fix restart uploading action not being propagated #1194
- Fix uploading progress not visible on image uploading overlay #1194
- Fix timestamp overlay jumping when more messages are loaded #1235
- Fix flickering of local messages while sending #1241
June 11, 2021
- Due to App Store Connect suddenly starting rejecting builds, we've renamed the following funcs everywhere:
ChannelConfig.commands
is no longer an optional #1182
_ChatChannelListVC.View
is now deprecated. Please useasView
instead #1174
- Add
staysConnectedInBackground
flag toChatClientConfig
#1170 - Add
asView
helper for getting SwiftUI views from StreamChatUI UIViewControllers #1174
- Logic for displaying suggestions (commands or mentions) were not compatible with SwiftUI, so it's changed to AutoLayout #1171
ChatChannelListItemView
now doesn't enable swipe context actions when there are noswipeableViews
for the cell. #1161- Fix websocket connection automatically restored in background #1170
- Commands view in composer is no longer displayed when there are no commands #1171 #1178
ChatMessageContentView
does not add views to main container in reverse order when.flipped
option is included #1125
June 04, 2021
Severity of changes: 🟢 minor
MessageLayoutOption.metadata
was renamed to.timestamp
#1141ComposerVC.showSuggestionsAsChildVC
was renamed toshowSuggestions
#1139- The inner structure of
ChatMessageBubbleView
was updated to match the common component pattern #1118 - The inner structure of
QuotedChatMessageView
was updated to match the common component pattern #1123 - The superclasses of
ImageAttachmentView
andImageCollectionViewCell
became generic overExtraData
#1111
- Add
areTypingEventsEnabled
,areReactionsEnabled
,areRepliesEnabled
,areReadEventsEnabled
,areUploadsEnabled
toChatChannelListController
#1085 - Add
ImageCDN
protocol to improve work with image cache and thumbnails #1111 - Add missing APIs
open
ofComposerVC
. Including the delegate implementations and showing the suggestions as a child view controller. #1140 - Add possibility to build the
StreamChat
framework on macOS #1132 - Add
scrollToLatestMessageButton
to Message list when there is new unread message #1147
- Fix background color of message list in dark mode #1109
- Fix inconsistent dismissal of popup actions #1109
- Fix message list animation glitches when keyboard appears #1139
- Fix issue where images might not render in the message composer in some cases #1140
- Fix issue with message bubbles not being updated properly when a message withing the same group is sent/deleted #1141, #1149
- Fix jumps on message list when old message is edited or when the new message comes #1148
ThreadVC
,ChatMessageReactionsVC
, andChatMessageRActionsVC
are now configurable viaComponents
#1155- Fix
CurrentUserDTO
not available after completion ofreloadUserIfNeeded
#1153
swipeableViewWillShowActionViews(for:)
andswipeableViewActionViews(for:)
areopen
now #1122- Add
preferredSize
toUIImageView.loadImage
function to utilise ImageCDN functions #1111 - Update
ErrorPayload
access control to expose for client-side handling #1134 - The default time interval for message grouping was changed from 10 to 30 seconds #1141
May 21, 2021
- Refresh authorization token when WebSocket connection disconnects because the token has expired #1069
- Typing indicator inside
ChatMessageListVC
#1073 ChannelController.freeze
and `unfreeze #1090 Freezing a channel will disallow sending new messages and sending / deleting reactions. For more information, see our docs
- Fix crash when opening attachments on iPad #1060 #997
- New channels are now visible even if the user was added to them while the connection was interrupted #1092
⚠️ The defaultBaseURL
was changed from.dublin
to.usEast
to match other SDKs #1078- Split
UIConfig
intoAppearance
andComponents
to improve clarity #1014 - Change log level for
ChannelRead
when it doesn't exist in channel fromerror
toinfo
#1043 - Newly joined members'
markRead
events will cause a read object creation for them #1068
May 03, 2021
ChatChannelListControllerDelegate
now has thecontrollerWillChangeChannels
method #1024
- Fix potential issues with data access from across multiple threads #1024
- Fix warning in
Package.swift
#1031 - Fix incorrect payload format for
MessageController.synchronize
response #1033 - Improve handling of incoming events #1030
April 23, 2021
- All channel events are correctly propagated to the UI.
April 23, 2021
- It's safe now to use
ChatChannel
andChatMessage
across multiple threads #984 - Web socket reconnection logic better handles the "no internet" errors #970
ChatChannelWatcherListController
now correctly loads initial watchers of the channel #1012
- Expose the entire quoted message on
ChatMessage
instead of itsid
#992 - Expose thread participants as a set of
ChartUser
instead of a set ofUserId
#998 ChatChannelListController
removes hidden channels from the list in the real time #1013CurrentChatUser
containsmutedChannels
field with the muted channels #1011ChatChannel
containsisMuted
andmuteDetails
fields with the information about the mute state of the channel #1011- Existing
ChatChannelListController
queries get invalidated when the current user membership changes, i.e. when the current users stops being a member of a channel, the channel stop being visible in the query #1016
- Updating the current user devices is now done manually by calling
CurrentUserController.synchronizeDevices()
instead of being automatically called onCurrentUserController.synchronize()
#1010
ChatMessage.quotedMessageId
is now deprecated. UsequotedMessage?.id
instead #992
April 09, 2021
- Channels are properly marked as read when
ChatChannelVC
is displayed #972 - Channels now support typing indicators #986
- Fix
ChannelController
s created withcreateChannelWithId
andcreateChannelWithMembers
functions not reporting their initial values #945 - Fix issue where channel
lastMessageDate
was not updated when new message arrived #949 - Fix channel unread count not being updated in the real time #969
- Fix updated values not reported for some controllers if the properties were accessed for the first time after
synchronize
has finished. Affected controllers wereChatUserListController
,ChatChannelListController
,ChatUserSearchController
#974
Logger.assertationFailure
was renamed toLogger.assertionFailure
#935
March 29, 2021
- Fix
ChannelDoesNotExist
error is logged byUserWatchingEventMiddleware
when channels are fetched for the first time #893 - Improve model loading performance by lazy loading expensive properties #906
- Fix possible loops when accessing controllers' data from within delegate callbacks #915
- Fix
channel.updated
events failing to parse due to missinguser
field #922 This was due to backend not sendinguser
field when the update was done by server-side auth.
- Introduce support for multitenancy -
teams
forUser
andteam
forChannel
are now exposed. #905 - Introduce support for pinned messages #896
- Expose
pinnedMessages
onChatChannel
which contains the last 10 pinned messages #896 - Expose
pinDetails
onChatMessage
which contains the pinning information, like the expiration date #896 - Add support for pinning and unpinning messages through
pin()
andunpin()
methods inMessageController
#896 - Add new optional
pinning: Pinning
parameter when creating a new message inChannelController
to create a new message and pin it instantly #896 - Add
lastActiveMembers
andlastActiveWatchers
toChatChannel
. The max number of entities these fields expose is configurable viaChatClientConfig.localCaching.chatChannel
#911
ChatChannel.latestMessages
now by default contains max 5 messages. You can change this setting inChatClientConfig.localCaching.chatChannel.latestMessagesLimit
#923
ChatChannel
's propertiescachedMembers
andwatchers
were deprecated. UselastActiveMembers
andlastActiveWatchers
instead #911
March 12, 2021
- Fix app getting terminated in background during an unfinished background task #877
- Introduce
MemberEventMiddleware
to observe member events and update database accordingly #880 - Expose
membership
value onChatChannel
which contains information about the current user membership #885 ChatChannelMember
now contains channel-specific ban information:isBannedFromChannel
andbanExpiresAt
#885- Channel-specific ban events are handled and the models are properly updated #885
March 09, 2021
- Add support for slow mode. See more info in the documentation #859
- Add support for channel watching events. See more info in the documentation #864
- Add support for channel truncating #864
ChatChannelNamer
is now closure instead of class so it allows better customization of channel naming inChatChannelListItemView
.
- Fix encoding of channels with custom type #872
- Fix
CurreUserController.currentUser
returning nil beforesynchronize()
is called #875
February 26, 2021
- Fix localized strings not being loaded correctly when the SDK is integrated using CocoaPods #845
- Fix message list crash when rotating screen #847
February 22, 2021
- Fix user devices not being removed locally when removed on the backend #882
- Fix issue with bad parsing of malformed attachment data causing channelList not showing channels #834
February 12, 2021
- Add support for custom attachment types with unknown structure #795
- Add possibility to send attachments that don't need prior uploading #799
- Improve serialization performance by exposing items as
LazyCachedMapCollection
instead ofArray
#776 - Reduce amount of fake updates by erasing touched objects #802
- Trigger members and current user updates on UserDTO changes #802
- Extracts the connection handling responsibility of
CurrentUserController
to a newChatConnectionController
. #804 - Allow delete/edit message for all users #809 By default, only admin/moderators can edit/delete other's messages, but this configurable on backend and it's not known by the client, so we allow all actions and invalid actions will cause backend to return error.
- Simplify attachment send API by combining
attachment
andattachmentSeeds
parameters. #815
- Fix race conditions in database observers #796
- Revert changeHash that became obsolete after #802 #813
February 2nd, 2021
- Add support for
enforce_unique
parameter on sending reactions #770
- Fix development token not working properly #760
- Fix lists ordering not updating instantly. #768
- Fix update changes incorrectly reported when a move change is present for the same index. #768
- Fix issue with decoding
member_count
forChannelDetailPayload
#782 - Fix wrong extra data cheat sheet documentation link #786
January 22nd, 2021
- Offline support: Browse channels and send messages while offline.
- First-class support for
SwiftUI
andCombine
: Built-it wrappers make using the SDK with the latest Apple frameworks a seamless experience. - Uses
UIKit
patterns and paradigms: The API follows the design of native system SDKs. It makes integration with your existing code easy and familiar. - Currently, 3.0 version is available only using CocoaPods. We will add support for SPM soon.
To use the new version of the framework, add to your Podfile
:
pod 'StreamChat', '~> 3.0'
In order to provide new features like offline support and SwiftUI
wrappers, we had to make notable breaking changes to the public API of the SDKs.
Please don't upgrade to version 3.0
before you get familiar with the changes and their impact on your codebase.
To prevent CocoaPods from updating StreamChat
to version 3, you can explicitly pin the SDKs to versions 2.x
in your podfile
:
pod 'StreamChat', '~> 2.0'
pod 'StreamChatCore', '~> 2.0' # if needed
pod 'StreamChatClient', '~> 2.0' # if needed
The framework naming and overall structure were changed. Since version 3.0, Stream Chat iOS SDK consists of:
Contains low-level logic and is meant to be used by users who want to build a fully custom UI. It covers functionality previously provided by StreamChatCore
and StreamChatClient
.
Contains a complete set of ready-to-use configurable UI elements that you can customize a use for building your own chat UI. It covers functionality previously provided by StreamChat
.
The best way to explore the SDKs and their usage is our sample app. It contains an example implementation of a simple IRC-style chat app using the following patterns:
UIKit
using delegatesUIKit
using reactive patterns and SDK's built-inCombine
wrappers.SwiftUI
using the SDK's built-inObservableObject
wrappers.- Learn more about the sample app at its own README.
- Cheat Sheet Real-world code examples showcasing the usage of the SDK.
- Controller Overview This page contains a list of all available controllers within StreamChat, including their short description and typical use-cases.
- Glossary A list of names and terms used in the framework and documentation.