- Fixed bug where
Reaction.hasCurrentUserReacted
doesn’t give correct value in some cases - Fixed bug where
GroupChannelCollection.loadMore
gives incorrect channels when created withGroupChannelListQuery
withlatestLastMessage
order
Deprecated as this version causes wrong ordering of channels from GroupChannelCollection.loadMore()
when the collection is created by GroupChannelListQuery
with .latestLastMessage
order.
- Added new properties in
Reaction
to support more usersclass Reaction { /// A list of sampled userIds that have reacted to this Reaction. public var sampledUserIds: [String] /// A count of the number of users who have reacted to this. public var count: UInt /// A flag indicating whether the current user has reacted to this. public var hasCurrentUserReacted: Bool }
- Added a property and classes for representing template messages.
- Introduced
ContainerOptions
class - Introduced
SimpleTemplateData
class - Introduced
TemplateMessageData
class - Added
templateMessageData
property of typeTemplateMessageData
toBaseMessage
class
- Introduced
- Added
BaseChannel.deleteMessage(messageId:hardDelete:completionHandler:)
to hard delete the message
- Disabled read/unread member count for
AdminMessage
- Improved logic to prevent crashes in
SessionWebSocketEngine
- Fixed a crash in
ChunkRange.contains(_:)
logic
- Fixed occasional crash in
SessionWebSocketEngine.listen()
when reconnecting.
- Improved
SendbirdChat.initialize()
andSendbirdChat.connect()
speed whenisLocalCachingEnabled
is true - Improved handling events related to reactions
- Fixed a bug where a channel gets unexpectedly unhidden upon receiving a new message
- Fixed a crash in range check logic
- Added timeout in
GroupChannelCollection.loadMore()
to prevent long delay during fetching channels - Fixed a bug where non-operator's message affects the last message and the unread message count for exclusive channels
- Modified
GroupChannel.markAsRead
behavior when called multiple times so thatGroupChannelDelegate.channelWasChanged(channel)
gets called when the unread count gets cleared
- Fixed bug where
requestId
is not being set properly when sending a user message
- Fixed internal
messageChangeLog
inMessageCollection
not updating to correct next token.
- Supports customTypes filtering on gets unreadItemCount
- Added
getUnreadItemCount(params:completionHandler:)
method inSendbirdChat
class - Added
GroupChannelUnreadItemCountParams
class - Deprecated
getUnreadItemCount(key:completionHandler:)
method inSendbirdChat
class
- Added
- Added
EventDetail
inChannelContext
to hold detailed information of channel events- i.e. Getting an inviter/invitees information when a channel has been added from receiving an invitation:
func addedChannels( _ collection: GroupChannelCollection, context: ChannelContext, addedChannels: [GroupChannel]) { if let detail = context.eventDetail as? EventDetail.UserReceivedInvitation { let inviter = detail.inviter let invitees = detail.invitees } }
- i.e. Getting an inviter/invitees information when a channel has been added from receiving an invitation:
- Added interfaces for
MessageForm
to work with Sendbird dashboard
(Form
interfaces have been deprecated)- Added
submitMessageForm(completionHandler:)
method inBaseMessage
class - Added
messageForm
property inBaseMessage
class - Added
MessageForm
class - Added
MessageFormItem
class - Added
MessageFormItem.Style
class - Added
MessageFormItem.LayoutType
enum - Added
MessageFormItem.ResultCount
enum - Deprecated
submitForm(form:completionHandler)
method inBaseMessage
class - Deprecated
forms
property inBaseMessage
class - Deprecated
Form
class and interfaces - Deprecated
FormField
class and interfaces - Deprecated
FormFieldAnswer
class and interfaces
- Added
- Fix invalid query parameter value in
getTotalScheduledMessageCount
request
- Support pinned message in
OpenChannel
- Added
pinnedMessageIds
property inBaseChannel
- Added
lastPinnedMessage
property inBaseChannel
- Added
pinMessage
method inBaseChannel
- Added
unpinMessage
method inBaseChannel
- Added
channelDidUpdatePinnedMessages
inOpenChannelDelegate
- Improved
SendbirdChat.createPinnedMessageListQuery
to use inOpenChannel
- Added
- Added
hasBot
andhasAIBot
properties inGroupChannel
- Fixed an issue with apiResult of the handler of
MessageCollection
receiving messages from a point in time beforeresetMyHistory()
call - Fixed to remove messages before resetMyHistory time from database when calling resetMyHistory
- Fixed for freeze status not updating
- Fixed timing for updating the count of participants
- Deprecated
SendbirdChat.authenticateFeed
; Please useSendbirdChat.authenticate
instead. - Added
SendbirdChat.getTotalUnreadNotificationsCount
to get the total unread notification count of the user. - Renamed
markAsViewed(messages:)
tologViewed(messages:)
. - Added push notification handling methods to accept the API host as a parameter for sending delivered and clicked requests.
SendbirdChat.markPushNotificationAsDelivered(apiHost:remoteNotificationPayload:completionHandler:)
SendbirdChat.markPushNotificationAsClicked(apiHost:remoteNotificationPayload:completionHandler:)
- Fixed an issue where
RequestHeadersContext
crashes due to_swift_release_dealloc
.
- Add macOS support.
- Add static library SDK.
- Fixed
Reaction
hash
andisEqual
to reflect same properties.
- Fixed an arithmetic overflow issue when entering a GroupChannel.
- Fixed
reportUsers
request failure issue - Fixed integer overflow when trying to access
Reaction.hash
- Improved stability
- Fixed
reportUsers
request failure issue - Fixed an issue with submitform request not working correctly
- Reduced the network traffic for the stats
- Improved stability
- Improved huge gap checking and message fill logic
- Fixed a bug where the API host setting is not applied to
authenticateFeed()
- Fixed feedback status changing when feedback payload is encoded
- Removed
v
from Sendbird ChatSDK tags - SwiftLint integration and warning fixes
- Improved stability
- Improved stability.
- Fixed feedback status changing when feedback payload is encoded.
- Updated iOS deployment target to 12.0
- Updated Xcode version to 15.0 for building SendbirdChatSDK framework
- Added
PrivacyInfo.xcprivacy
for Apple Privacy Manifest
- Added
keys
filter toMessageTemplateListParams
- Added
markPushNotificationAsClicked(remoteNotificationPayload:completionHandler:)
toSendbirdChat
- Added
markAsViewed(messages:)
toFeedChannel
- Deprecated
logImpression(messages:)
inFeedChannel
- Deprecated
- Added
logClicked(message:)
toFeedChannel
- Fixed a bug where the
myLastRead
was updated with the improper timestamp - Improved stability
- Added message template interfaces
- Added classes
MessageTemplateListParams
classMessageTemplate
classMessageTemplateInfo
classMessageTemplateList
class
- Added functions
getMessageTemplateList(token:params:completionHandler:)
function inSendbirdChat
classgetMessageTemplate(key:completionHandler:)
function inSendbirdChat
class
- Added handlers
MessageTemplateHandler
inHandlers
classMessageTemplateListHandler
inHandlers
class
- Added
messageTemplateInfo
property inAppInfo
class
- Added classes
- Fixed negative value setting case when backsync progress
- Improved stability
- Fix an issue where the
completionHandler
ofsendFileMessage
would be called multiple times.
- Added the
notificationPriority
property toBaseMessage
class
- Fixed
.data
ofMultipleFilesMessage
- Fixed
UploadedFileInfo.thumbnail.url
returning aplainURL
withouteKey
when file encryption attribute is ON
- Fixed a bug where the stat collector is not enabled when the
authenticateFeed()
is used - Fixed a bug where the unread message count of feed channel becomes zero when the SDK receives a message from the chat notification channel
- Improved unread message count logic
- Improved stability
- Initialization improving
- Added
needsSynchronous
property inInitParams
class - Added
init(applicationId:isLocalCachingEnabled:localCacheConfig:logLevel:appVersion:needsSynchronous:)
method inInitParams
class - Added
InitializationState
enum - Added
executeOrWaitForInitialization(executeHandler:)
method in SendbirdChat - Deprecated
initializeSynchronously(params: InitParams)
method inSendbirdChat
.- Set
needsSynchronous
inInitParams
totrue
and useinitialize(params:migrationStartHandler:completionHandler:)
instead.
- Set
- Modified qos priority of local caching migration queue
- Added
- Added
inMemoryUserInfo
property inBaseMessage
- Fixed feedback not working correctly
- Added localizedFailureReason for
ChatError.connectionCanceled
error when the app moved to background while connecting - Improved stability
- Improved stability
- Improved stability
- Added
Form
,FormField
andFormFieldAnswer
model classes. - Added
submitForm(form:completionHandler:)
public interface. - Added
forms
andsuggestedReplies
properties inBaseMessage
.
- Added
Feedback
andFeedback.Status
model classes - Added public interfaces methods in
BaseMessage
- Added
submitFeedback(rating:comment:completionHandler:)
- Added
updateFeedback(rating:comment:completionHandler:)
- Added
deleteFeedback(completionHandler:)
- Added
- Fixed a bug where the
messageCollection(_:context:channel:addedMessages:)
is not invoked after reconnecting if theMessageCollection
object was created for an empty group channel
- Fixed group channel's metadata being overwritten by group channel changelog when using local caching without turning on the app attribute
enable_changelog_metadata
- Updated SendbirdChatSDK licenses
- improve Stability
- Fixed a bug where the order of the messages from the
messageCollection(_:context:channel:addedMessages:)
delegate was not sequential
- Added
logCustom()
inFeedChannel
to log custom stat - Added
NotificationMessageStatus
to represent whether the message was read or not - Changed to not change channel's
isDirty
property when app switches from background to foreground - Removed rate limit from markAsRead
- Improved logic to call the API in unnecessary situations in the
getChannel
while using local caching - Improved stability
- Improved stability
- Added methods on
GroupChannel
getDeliveryStatus(includeAllMembers:)
getDeliveryStatusAsObjects(includeAllMembers:)
getReadStatusAsObjects(includeAllMembers:)
- Added
DeliveryStatus
,ReadStatus
- Fixed Syntax error in SQL statement
- Added
extendedMessagePayload
property toBaseMessage
- Improved stability
- Fixed a bug where the callback of
__getUIKitConfiguration()
can be called twice. - Stability improvements.
- Fixed an issue where
MessageCollection
doesn't update messages when reconnected. - Stability improvements.
- Fixed an issue where
MessageCollection
doesn't update messages when reconnected. - Stability improvements.
- Added
createdBefore
andcreatedAfter
filters in GroupChannelListQueryParams and PublicGroupChannelListQueryParams. - Added
enableAutoResend
inInitParams.LocalCacheConfig
to control auto-resending feature when local cache is enabled. - Added
NotificationData
class. - Added
isCategoryFilterEnabled
property inFeedChannel
. - Added
isTemplateLabelEnabled
property inFeedChannel
. - Added
categories
property inFeedChannel
.
- You can mark push notifications as delivered within the SDK, tracking delivery status.
- Added
SendbirdChat.markPushNotificationAsDelivered
.
- Added
SendbirdChat.markPushNotificationAsDelivered(remoteNotificationPayload: payload)
- Added 'SendbirdChat.authenticateFeed' for Sendbird Notifications
- Added 'SendbirdChat.refreshNotificationCollections' for Sendbird Notifications
- Fixed a bug where the group channel changelogs did not update the group channel metadata
- Added
copyMultipleFilesMessage(_:toTargetChannel:completionHandler:)
- Added
resendMultipleFilesMessage(_:fileUploadHandler:completionHandler:)
- Stability improvements.
- Fixed a bug where the group channel changelogs did not update the group channel metadata
- Resolved the inconsistency between WebSocket connection state and network reachability
- Fixed a crash that can happen when SessionExpiredEvent is received
- Improved stability
- Added
isBot
property inUser
model to identify whether the sender is a Bot
- Fixed a bug where GroupChannelDelegate method func
channelDidUpdateTypingStatus(_ channel: GroupChannel)
was not being called when a typer becomes idle
- Fixed a security flaw related to the connection
- Fixed a bug where a group channel can be filtered out when a message in the channel is removed
- Improved stability
iOS Chat SDK version `4.9.0` has a bug where FileMessage is not received. Please skip version `4.9.0`, and update to version **`4.9.1`** or above instead.
- Fixed FileMessage being parsed as MultipleFilesMessage
You can send a MultipleFilesMessage
that contains multiple files in a single message via GroupChannel.sendMultipleFilesMessage(params:fileUploadHandler:completionHandler:)
- Added
MultipleFilesMessage
. - Added
GroupChannel.sendMultipleFilesMessage
,MultipleFilesMessageCreateParams
,UploadableFileInfo
andUploadedFileInfo
. - Added
MultipleFilesMessageHandler
andFileUploadHandler
. - Added
SendbirdChat.getMultipleFilesMessageFileCountLimit()
that indicates the maximum count of files that can be included in a single message.
let params = MultipleFilesMessageCreateParams(
uploadableFileInfoList: [UploadableFileInfo(file: file), UploadableFileInfo(fileURL: fileUrl)]
)
channel.sendMultipleFilesMessage(
params: params,
fileUploadHandler = { requestId, index, uploadableFileInfo, error ->
// handle the upload result of each UploadableFileInfo.
},
completionHandler = { message, error ->
// handle the result of sending MultipleFilesMessage.
}
)
- Fixed not to hang main thread when requesting huge gap API
- Fixed issues in
MessageCollection.startCollection
andNotificationCollection.startCollection
- Fixed an error that returned duplicate cache messages
- Fixed an issue that did not fetch cache messages based on starting point
- Resolved DB migration issue
- Fixed
MessageCollectionDelegate.messageCollection(_:context:channel:updatedMessages:)
to be invoked after sending a message via API fallback - Fixed
GroupChannelCollectionDelegate.channelCollection(_:context:addedChannels:)
to not be invoked for added messages untilloadMore
is called inGroupChannelCollection
- Improved stability
- Improved stability
- Added
includeParentMessageInfo
toPinnedMessageListQueryParams
- Fixed a crash issue that occurred when encoding
User
You can now retrieve all pinned messages within a GroupChannel by the PinnedMessageListQuery
.
- Added
PinnedMessage
- Added
PinnedMessageListQuery
,PinnedMessageListQueryParams
- Added
createPinnedMessageListQuery(params:)
forGroupChannel
object
let queryParams = PinnedMessageListQueryParams { params in
params.limit = 20
// Set other properties in `params`
}
self.query = channel.createPinnedMessageListQuery(queryParams)
self.query.loadNextPage { messages, error in
// Handle result
}
- Added URL encoding for
userId
with non-ascii characters
You can now automatically detect when a muted user is unmuted by leveraging MessageCollection
.
Clients will now receive MessageCollectionDelegate.messageCollection(_:context:updatedChannel:)
with CollectionEventSource.eventUserUnmuted
when an user is unmuted after their muted duration has expired, on top of explict unmute calls. This now means that you can easily transition user’s experience and allow them to chat even more seamlessly.
Note that this is a MessageCollections only feature! We recommend all of our clients to give it a try if you haven’t : )
- Updated iOS deployment target to 11.0 for Xcode 14.1+
- Fixed crash issue that occurred when encoding GroupChannel
- Improved stability
- Changed default value of nextResultSize and prevResultSize in MessageCollection to 40
- Stability improvements
- Fixed a bug where a group channel collection returns channels for other user who used the device
- Fixed an error where the previous user's channels remained in the database
- Fixed a bug where a group channel collection could return duplicated channels
- Improved local caching hit ratio
- Fixed group channel collection's channelList not being updated properly after hiding a channel
- Added ephemeral support for open channels
- Fixed a bug where the 'Allowed domains' denies the connection from the SDK
- Fixed an issue where network wouldn't properly reconnect when connect() is called again with a different user id
You can now control the size of your local cache. Starting from 64mb, decide how much you want to store (Default: 256mb).
Once the size limit is reached, the SDK will automatically remove messages and channels with pre-specified logic (clearOrder
) so that you don't have to actively manage it.
- Added DB size related properties in
LocalCacheConfig
let localCacheConfig = LocalCacheConfig()
localCacheConfig.maxSize = 256
localCacheConfig.clearOrder = .messageCollectionAccessedAt
- Added SendbirdChat.getTotalUnreadMessageCountWithFeed(params:completionHandler:)
- Deprecated SendbirdChat.getTotalUnreadMessageCount(params:completionHandler:)
- Added UserEventDelegate.didUpdateTotalUnreadMessageCount(unreadMessageCount:)
- Deprecated UserEventDelegate.didUpdateTotalUnreadMessageCount(_:totalCountByCustomType:)
- Fixed an issue where push notification doesn't get delivered to some users
Locally saved chats in your user's device can now be encrypted with FileProtectionType.completeUnlessOpen
protection level.
To enable this protection, please refer to below guide and API Reference.
When creating InitParams
, set LocalCacheConfig.isEncryptionEnabled
to true
. This option is turned off by default, so you don't have to set anything up if you don't intend to use it.
let localCacheConfig = LocalCacheConfig(isEncryptionEnabled: true)
let initParams = InitParams(
applicationId: appId,
isLocalCachingEnabled: true,
localCacheConfig: localCacheConfig
)
- Fixed not to delete pendingPushToken after applying cache configuration
⚠️ DO NOT USE THIS VERSION: There is a bug where the pending push token is removed after connecting a user.
Polls is now supported in both Open Channels and Group Channels!
Moved following methods from GroupChannel
to BaseChannel
:
- func updatePoll(pollId: Int64, params: PollUpdateParams, completionHandler: PollHandler?)
- func deletePoll(pollId: Int64, completionHandler: SBErrorHandler?)
- func closePoll(pollId: Int64, completionHandler: PollHandler?)
- func addPollOption(pollId: Int64, optionText: String, completionHandler: PollHandler?)
- func updatePollOption(pollId: Int64, pollOptionId: Int64, optionText: String, completionHandler: PollHandler?)
- func deletePollOption(pollId: Int64, pollOptionId: Int64, completionHandler: SBErrorHandler?)
- func votePoll(pollId: Int64, pollOptionIds: [Int64], completionHandler: PollVoteEventHandler)
- func getPollChangeLogs(token: String?, completionHandler: PollChangeLogsHandler?)
- func getPollChangeLogs(timestamp: Int64, completionHandler: PollChangeLogsHandler?)
- func createPollListQuery(limit: UInt = 20) -> PollListQuery?
- func createPollVoterListQuery(pollId: Int64, pollOptionId: Int64, limit: UInt = 20) -> PollVoterListQuery
Added the following interfaces in OpenChannelDelegate:
- func channel(_ channel: OpenChannel, didUpdatePoll event: PollUpdateEvent)
- func channel(_ channel: OpenChannel, didVotePoll event: PollVoteEvent)
- func channel(_ channel: OpenChannel, pollWasDeleted pollId: Int64)
Added the following interfaces in Polls:
Poll.serialize()
Poll.build(fromSerializedData:)
- Fixed a bug where the size of the DB file was not being updated after disconnection
⚠️ DO NOT USE THIS VERSION: There is a bug where the pending push token is removed after connecting a user.
When you call SendbirdChat.disconnect
, it disconnects the WebSocket and clears local cache. You can think of it as logging out.
In some cases, you need to only disconnect the WebSocket. You can now do it by calling SendbirdChat.disconnectWebSocket
.
It only disconnects the WebSocket and preserves the local cache.
SendbirdChat.disconnectWebSocket {
// onDisconnected
}
To connect again after disconnecting with disconnectWebSocket()
,
use SendbirdChat.connect().
SendbirdChat.connect(userId: userId) { user, error in
if let user = user {
// onConnected
} else {
// Handle error.
}
}
- Fixed to prevent initializing SendbirdChat multiple times with same
applicationId
andisLocalCachingEnabled
⚠️ DO NOT USE THIS VERSION: There is a bug where the pending push token is removed after connecting a user.
- Fixed group channel querying with nickname filters (
nicknameContainsFilter
,nicknameExactMatchFilter
,nicknameExactMatchFilter
) to behave the same whether or not local caching is enabled
⚠️ DO NOT USE THIS VERSION: There is a bug where the pending push token is removed after connecting a user.
- Added default value for
params
argument in each interface:BaseChannel.getMessageChangeLogs(token:params:completionHandler)
BaseChannel.getMessageChangeLogs(timestamp:params:completionHandler)
SendbirdChat.getMyGroupChannelChangeLogs(token:params:completionHandler)
SendbirdChat.getMyGroupChannelChangeLogs(timestamp:params:completionHandler)
registerDevicePushToken(_:unique:completionHandler:)
passes error to completionHandler when called before SendbirdChat is initialized- Fix a bug that the collection's callback is not called
Participant class in Open Channel
Participant is a new interface for User who joined Open Channel. It's optimized for scalability and contains much lighter information about the User than a Member in Group Channel. Now clients can implement Open Channels easier in SDK with more built-in capabilities. You can compare how Member, Participant, and User are different here.
Participant
holds essential information about the participant like below. They contain their muted status (is_muted
) on top of basic User information.
@objc(SBDParticipant)
public class Participant: User {
@objc
public internal(set) var isMuted: Bool
@objc
public func serialize() -> Data?
@objc
public class func build(fromSerializedData data: Data?) -> Self?
}
ParticipantListQuery.loadNextPage(completionHandler: @escaping UserListHandler)
now returns[Participant]
- For backward compatibility, the
UsersHandler
returnsUser
list, but it can be casted intoParticipant
- For backward compatibility, the
You can now set longer timeout value (Previously 10s) for session token expiry. (Default: 60s, Maximum: 1800s). This means that Sendbird SDK will wait longer for your new session token, making it easier for you to reconnect to our service.
@objc class func setSessionTokenRefreshTimeout(_ timeout: Int)
- Fixed bug where
BaseChannelHandler.onChannelChanged
andGroupChannelHandler.onPinnedMessageUpdated
are not being called when the pinned message is updated - Fixed channelURL filter not working when fetching pendingMessage
- Fixed wrong channels being returned in copyMessage completionHandler
- Improved database synchronization stability
- Fixed a bug where unread count of channels is not updated in time
- Changed to ensure reachability notification is called on the main thread
- Fixed a bug where channel filters (ex:
channelURLFilter
) were not applied properly inGroupChannelCollection
Pinned Message is released. You can now maintain a special set of messages (up to 10 per channel) that you want everyone in the channel to share. It can be anything from announcements, surveys, upcoming events, and any many more. Pin your messages and never miss them! Stay tuned for updates as we are rolling out more exciting features and see below for exact specifications:point_down:
- Pin when sending a message
UserMessageCreateParams.isPinnedMessage: Bool = false
FileMessageCreateParams.isPinnedMessage: Bool = false
- Pin existing message
GroupChannel.pinMessage(messageId:completionHandler:)
- Unpin a message
GroupChannel.unpinMessage(messageId:completionHandler:)
- Pinned messages
GroupChannel.lastPinnedMessage: BaseMessage? = nil
GroupChannel.pinnedMessageIds: [Int64]? = nil
We strongly recommend using Collections (Message, Channel) to implement Pinned Messages as it would automatically take care of numerous events out of the box when messages are created, updated, and deleted.
- Added
use_local_cache
to the request header - Removed internal logs
- Added
urlSession(_:task:didCompleteWithError:)
method implementation to the native web socket engine
- Fixed a memory leak in the web socket engine
- Added error log when using uninitialized Sendbird instance
- Fixed to upsert channel change into database when receiving events
- Fixed to use cached open channel when receiving system event
- Fixed a bug where
GroupChannelCollection::loadMore
'scompletionHandler
is not called under iOS 13
- Fixed a crash issue when logging in RequestQueue
- Fixed filtering logic (
joinedOnly
) inGroupChannelListQuery.myMemberStateFilter
- Fixed an issue where deleted channels remain in the local cache
- Applied atomicity to
cacheChannels
,hasNext
inGroupChannelCollection
- Fixed concurrency issue in
SafeDictionary
- Fixed concurrency issue in
CachedDataMap
- Fixed
MarkAsDelivered(remoteNotificationPayload: completionHandler:)
to work without being connected - Fixed a deserialized fileMessage's eKey not updating
- Added reachability log
- Fixed concurrency issue on user connection
- Fixed a bug where the request ID of the user message response sent through the API is empty
- Fixed a bug when parsing other user's VOTE event
- Fixed a bug where poll changeLog not being delivered in message collection
- Changed PollListQueryParams.limit's defalut value 20 to 10
- Fixed default value of user.isActive
Polls is released 🎉 Here’s where we think it will be really powerful.
- Collect feedback and customer satisfaction
- Drive engagement by receiving participants in preferences
- Run surveys and quiz shows
- And many more!
Scheduled messages is released Here’s where we think it will be really useful.
- Let your users queue their messages for the future
- Set helpful reminders and notifications to nudge certain actions
- And many more!
Please note that both Polls and Scheduled Messages are released as beta features. Thus specific parameters and properties may change to improve client’s overall experience.
Stay tuned for updates as we are rolling out more exciting features and see below for exact specifications
- Create
Poll.create(params: PollCreateParams, completionHandler: @escaping PollHandler)
UserMessageCreateParams.pollId
- Read
Poll.get(params: PollRetrievalParams, completionHandler: @escaping PollHandler)
SendbirdChat.createPollListQuery(params: PollListQueryParams)
SendbirdChat.createPollListQuery(paramsBuilder: (PollListQueryParams) -> Void)
GroupChannel.createPollListQuery(limit: UInt)
UserMessage.poll
- Update
GroupChannel.updatePoll(pollId: Int64, params: PollUpdateParams, completionHandler: PollHandler?)
GroupChannel.closePoll(pollId: Int64, completionHandler: PollHandler?)
- Delete
GroupChannel.deletePoll(pollId: Int64, completionHandler: SBErrorHandler?)
- Others:
Poll
GroupChannel.getPollChangeLogs(token: String?, completionHandler: PollChangeLogsHandler?)()
GroupChannel.getPollChangeLogs(timestamp: Int64, completionHandler: PollChangeLogsHandler?)()
PollData
GroupChannelDelegate.channel(_ channel: GroupChannel, didUpdatePoll event: PollUpdateEvent)
GroupChannelDelegate.channel(_ channel: GroupChannel, didVotePoll event: PollVoteEvent)
GroupChannelDelegate.channel(_ channel: GroupChannel, pollWasDeleted pollId: Int64)
- Create
PollCreateParams.optionTexts
GroupChannel.addPollOption(pollId: Int64, optionText: String, completionHandler: PollHandler?)
- Read
PollOption.getPollOption(params: PollOptionRetrievalParams, completionHandler: @escaping PollOptionHandler)
SendbirdChat.createPollVoterListQuery(params: PollVoterListQueryParams)
SendbirdChat.createPollVoterListQuery(paramsBuilder: (PollVoterListQueryParams) -> Void)
GroupChannel.createPollVoterListQuery(pollId: Int64, pollOptionId: Int64, limit: UInt)
- Update
GroupChannel.updatePollOption(pollId: Int64, pollOptionId: Int64, optionText: String, completionHandler: PollHandler?)
GroupChannel.votePoll(pollId: Int64, pollOptionIds: [Int64], completionHandler: PollVoteEventHandler)
- Delete
GroupChannel.deletePollOption(pollId: Int64, pollOptionId: Int64, completionHandler: SBErrorHandler?)
- Others:
PollOption
PollStatus
PollVoteEvent
PollUpdateEvent
CollectionEventSource.eventPollUpdated
CollectionEventSource.eventPollVoted
CollectionEventSource.eventPollChangeLog
- Create
GroupChannel.createScheduledUserMessage()
GroupChannel.createScheduledFileMessage()
- Read
ScheduledMessageListQuery
BaseMessage.getScheduledMessage()
ScheduledMessageRetrievalParams
- Update
GroupChannel.updateScheduledUserMessage()
GroupChannel.updateScheduledFileMessage()
- Delete
GroupChannel.cancelScheduledMessage()
- Others
ScheduledInfo
MessageSendingStatus.scheduled
BaseMessage.scheduledInfo
SendbirdChat.getTotalScheduledMessageCount()
TotalScheduledMessageCountParams
- Added public
make(_ json:)
interface - Added synchronous initialize for SendbirdChat
- Removed unused keys from body of MarkAsDelivered request
- Added nicknameStartsWithFilter, nicknameExactMatchFilter feature in GroupChannelListQuery and its params
- Implemented history of channel membership where clients can now track whether users have joined or left the channel (
MemberState.left
for left members of aGroupChannel
) - Resolved priority inversion warning
- Fixed a crash when a large file is sent in the FILE message
- Fixed crash issue when using
SendbirdChat.add(_:identifier)
- Added metaData related logic for filtering in GroupChannelListQuery.belongsTo
- Renamed methods in
SendbirdChat
add(_ delegate: ConnectionDelegate, identifier: String)
->addConnectionDelegate(_ delegate: ConnectionDelegate, identifier: String)
add(_ delegate: BaseChannelDelegate, identifier: String)
->addChannelDelegate(_ delegate: BaseChannelDelegate, identifier: String)
add(_ delegate: UserEventDelegate, identifier: String)
->addUserEventDelegate(_ delegate: UserEventDelegate, identifier: String)
- Fixed a bug where a dirty flag of a group channel is handled improperly
- Added MessageSearchQuery's totalCount and made it public
- Fixed memory problem when continuously sending large files
- Changed the keywords of the classes and functions below from public to open (subclassing)
User, BaseChannel, GroupChannel, OpenChannel, BaseCollection, GroupChannelCollection, BaseMessage, UserMessage, FileMessage, AdminMessage
Note: However, subclassing is not recommended, and please be aware that any issue that arises from subclassing will take substantially longer time to react
- Added shouldRemoveOperatorStatus function
- Updated copyMessage function to only duplicate successfully sent message. Copying any non-successful message will now return an invalidParameter error
- Fixed concurrency issues
- Fixed WS connection being lost after switching from wifi to LTE
- Fixed OpenChannel not updating channel’s changed information
- Fixed a copied fileMessage’s image not being shown
- Fixed auto-resend issue in offline write
- Fixed a bug that serializing pending messages causes a crash on iOS 12 or lower
- Fixed a bug that sending a file message doesn’t work on the app extension
- Fixed a bug that sending a file message doesn’t work on the app extension
- Fixed a bug that the file URL of the file message is not accessible
- Fixed a bug that the message collection can’t load the previous messages when the network is not connected
- Fixed a bug that the reaction event is not applied to the cached messages
- Fixed a bug in the message search query
- Fixed a bug that the message collection can't call the message update event when the reconnection is completed
- Improved stability
- Improved stability
- Fixed a bug that the message collection returned failed messages across all channels
- Changed the default value of
memberInfoInMessage
totrue
- Fixed a message search bug
- Improved stability
- Fixed a bug that the failed message isn’t removed from the memory cache of the message collection
- Fixed
createBannedUserListQuery
to use the params builder - Fixed unstable reconnection on the simulator
To see detailed changes for below items, please refer to the migration guide
- Added mentioned users to pending, and failed messages
- When operatorUserIds = nil, exclude operator_ids field from json request
- Added mentioned message template
- Added id to User, BaseChannel and BaseMessage to conform to Identifiable
- Add MyMemberStateFilter for group channel count and channel query
- Fixed SBDPushTemplate.default and SBDPushTemplate.alternative as public
- Changed User's userId type from optional String to non-optional String
- Changed internal logic of log levels. Now, only logs with equal or higher log level than the specified LogLevel are printed
- Codebase has been re-written from Objective-C to Swift
- Added annotations for renamed methods and
- Changed the type of the value that the
loadNextPage()
of theMutedUserListQuery
and theBannedUserListQuery
return through the callbacks to the array of theRestrictedUser
- Changed the parameter's type of the
channel(_:userWasMuted:)
andchannel(_:userWasBanned:)
ofBaseChannelDelegate
to theRestrictedUser
- Naming of the Product has been changed from
SendBirdSDK
toSendbirdChatSDK
- Naming of the main class has been changed from
SBDMain
toSendbirdChat
- Naming of public interfaces has been renamed to better match Swift's language style guide
- Deprecated interfaces from v3 has been removed
- Support for SyncManager has been removed.
- Removed the SBD prefix across names for all constants, protocols, classes, enums, and type definitions
- Removed
with
orby
phrase from parameter names - Renamed
SBDMain
toSendbirdChat
- Renamed
SBDOptions
toSendbirdChatOptions
SBDChannelDelegate
is separated intoBaseChannelDelegate
,OpenChannelDelegate
, andGroupChannelDelegate
protocols- Conform to either
OpenChannelDelegate
orGroupChannelDelegate
to receive events about the channels - Renamed
SBDError
toSBError
- Deprecating support for
Mappable
protocol; Please use Swift's Codable instead to serialize/deserialize objects. For Objective-C, it stays the same - Renamed property name such as coverUrl, channelUrl to coverURL and channelURL (capitalize short name) to follow swift convention
SBDConnectionManager
SBDUserListQuery
; Please use specific queries for querying users instead, i.e.ApplicationUserListQuery
andBlockedUserListQuery
SBDAuthenticateDelegate
clearCachedData(completionHandler:)
completion typeVoid
toSBErrorHandler
initWithApplicationId
toinitialize(params:)
getChannelCount
togetGroupChannelCount
getChannelCountWithMemberStateFilter:
togetGroupChannelCountWithMemberStateFilter:
.
createAllUserListQuery
; UsecreateApplicationUserListQuery
createUserListQueryWithUserIds
; UsecreateApplicationUserListQuery(params:)
getPendingPushKitToken
; PushKit is not supported anymoreregisterDevicePushKitToken
; PushKit is not supported anymoreunregisterPushKitToken
; PushKit is not supported anymoremarkAsDeliveredWithChannelUrl
; The feature is supported internallygetMyGroupChannelChangeLogs(byToken:customType:includeEmptyChannel:)
; UsegetMyGroupChannelChangeLogs(token:params:completionHandler:)
getMyGroupChannelChangeLogs(byTimestamp:customType:includeEmptyChannel)
; UsegetMyGroupChannelChangeLogs(timestamp:params:completionHandler:)
- All of
updateCurrentUserInfo
related methods; UseupdateCurrentUserInfo(params:progressHandler:completionHandler:)
useMemberAsMessageSender
touseMemberInfoInMessage
coverUrl
tocoverURL
channelUrl
tochannelURL
sendUserMessage(_:data:customType:targetLanguages:completionHandler:)
; UsesendUserMessage(params:completionHandler:)
updateUserMessage(_:messageText:data:customType:completionHandler:)
; UseupdateUserMessage(params:completionHandler:)
getPreviousAndNextMessages
,getNextMessages
,getPreviousMessages
; UsegetMessages(messageId:params:completionHandler:)
getMessageChangeLogs(token:completionHandler:)
,getMessageChangeLogs(byTimestamp:completionHandler:)
; UsegetMessageChangeLogs(params:completionHandlers:)
sendMarkAsReadEnable
; The feature was deprecated inv3.0.24
isPushEnabled
; UsemyPushTriggerOption
createChannel(isDistinct:users:coverImage:coverImageName:data:customType:progressHandler:completionHandler:)
; UsecreateChannel(params:progressHandler:completionHandler:)
updateChannel(isDistinct:coverImage:coverImageName:data:customType:progressHandler:completionHandler:)
; UseupdateChannel(params:progressHandler:completionHandler:)
getChannelWithoutCache
; The feature was deprecated inv3.0.116
hideChannel(completionHandler:)
; Usehide(hidePreviousMessages:allowAutoUnhide:completionHandler:)
getChannelFromCacheWithChannelUrl
; The feature was deprecated inv3.0.116
getReadReceiptOfMessage
; UsegetUnreadMemberCount(_:)
getLastSeenAtByUser
,getLastSeenAtByUserIdUse
,getReadMembersWithMessage
, andgetDeliveryReceipt
; UsegetUndeliveredMemberCount
getTypingMembers
; UsegetTypingUsers
setPushPreference
; UsesetMyPushTriggerOption(_:completionHandler:)
getTotalUnreadMessageCount
; UseSendbirdChat.getTotalUnreadMessageCount
createChannel(channelUrl:coverImage:coverImageName:data:operatorUserIds:customType:progressHandler:completionHandler:)
; UsecreateChannel(params:progressHandler:completionHandler:)
updateChannel(coverImage:coverImageName:data:operatorUserIds:customType:progressHandler:completionHandler:)
; UseupdateChannel(params:progressHandler:completionHandler:)
channel(_:didReceive:)
is moved toBaseChannelDelegate
channel(_:didUpdate:)
is moved toBaseChannelDelegate
channel(_:didReceiveMention:)
is moved toBaseChannelDelegate
channel(_:userWasMuted:)
is moved toBaseChannelDelegate
channel(_:userWasUnmuted:)
is moved toBaseChannelDelegate
channel(_:userWasBanned:)
is moved toBaseChannelDelegate
channel(_:userWasUnbanned:)
is moved toBaseChannelDelegate
channelWasFrozen(_:)
is moved toBaseChannelDelegate
channelWasUnfrozen(_:)
is moved toBaseChannelDelegate
channelWasChanged(_:)
is moved toBaseChannelDelegate
channelWasDeleted(_:channelType:)
is moved toBaseChannelDelegate
channel(_:messageWasDelegate:)
is moved toBaseChannelDelegate
channel(_:createdMetaData:)
is moved toBaseChannelDelegate
channel(_:updatedMetaData:)
is moved toBaseChannelDelegate
channel(_:deletedMetaDataKeys:)
is moved toBaseChannelDelegate
channel(_:createdMetaCounters:)
is moved toBaseChannelDelegate
channel(_:updatedMetaCounters:)
is moved toBaseChannelDelegate
channel(_:deletedMetaCountersKeys:)
is moved toBaseChannelDelegate
channel(_:updatedReactions:)
is moved toBaseChannelDelegate
channelDidUpdateOperators(_:)
is moved toBaseChannelDelegate
channel(_:didUpdateThreadInfo:)
is moved toBaseChannelDelegate
channelDidUpdateReadStatus(_:)
is moved toGroupChannelDelegate
channelDidUpdateDeliveryStatus(_:)
is moved toGroupChannelDelegate
channelDidUpdateTypingStatus(_:)
is moved toGroupChannelDelegate
channelDidChangeMemberCount(_:)
is moved toGroupChannelDelegate
channel(_:didReceiveInvitation:inviter:)
is moved toGroupChannelDelegate
channel(_:didDeclineInvitation:inviter:)
is moved toGroupChannelDelegate
channel(_:userDidJoin:)
is moved toGroupChannelDelegate
channel(_:userDidLeave:)
is moved toGroupChannelDelegate
channelWasHidden(_:)
is moved toGroupChannelDelegate
channelDidChangeParticipantCount(_:)
is moved toOpenChannelDelegate
channel(_:userDidEnter:)
is moved toOpenChannelDelegate
channel(_:userDidExit:)
is moved toOpenChannelDelegate
- Introduced
InitParams
forSendbirdChat.initialize(params:)
- Introduced
UserUpdateParams
forSendbirdChat.updateCurrentUserInfo(params:)
UserMessageParams
toUserMessageCreateParams
andUserMessageUpdateParams
FileMessageParams
toFileMessageCreateParams
andFileMessageUpdateParams
GroupChannelParams
toGroupChannelCreateParams
andGroupChannelUpdateParams
strict
toisStrict
discoverable
toisDiscoverable
OpenChannelParams
toOpenChannelCreateParams
andOpenChannelUpdateParams
- Please refer to the Changelog for v4 beta
- Please refer to the Changelog for v3