- Default
UITableView.loadingCellchanged:- from
func loadingCell(at indexPath: IndexPath) -> UITableViewCell - to
func loadingCell(at indexPath: IndexPath, textColor: UIColor) -> UITableViewCell
- from
- Default
UITableView.statusCellchanged:- from
func statusCell(... subtitle: String? = nil, highlighted: Bool) -> UITableViewCell - to
func statusCell(... subtitle: String? = nil, textColor: UIColor) -> UITableViewCell
- from
- Banner animation without bouncing.
- Customization for message actions.
- Added
Event.reactionUpdated. - Opened
MessageTableViewCell. - Opened
ChannelTableViewCell. - More customization for a message and channel cells.
- Added
AvatarViewStyle - Added
SeparatorStyle - Added
Spacing - Added
ChannelTableViewCell.VerticalTextAlignment MessageTableViewCell.avatarViewStyle: AvatarViewStyle?MessageTableViewCell.spacing: SpacingMessageTableViewCell.edgeInsets: UIEdgeInsetsChannelTableViewCell.avatarViewStyle: AvatarViewStyle?ChannelTableViewCell.separatorStyle: SeparatorStyleChannelTableViewCell.nameNumberOfLines: IntChannelTableViewCell.messageNumberOfLines: IntChannelTableViewCell.height: CGFloatChannelTableViewCell.spacing: SpacingChannelTableViewCell.edgeInsets: UIEdgeInsetsChannelTableViewCell.verticalTextAlignment: VerticalTextAlignment
- Added
- Added a customization for message actions.
- Example app for a memory leak.
- Keyboard events replays.
- Handling keyboard notifications for ChatViewController in rx way.
- Scroll the table view to the bottom safely.
- Fixed a crash when the token was expired.
- Fixed
StatusTableViewCelllayout.
December 16th, 2019
- The order of parameters in
Message.init - Removed members from
ChannelResponse. Now it's only inside the channel of the response.
- Improved Token validation.
- Public
Attachment.init(...). - Public
Reaction.init(...). - Public
Reaction(counts: [ReactionType: Int]). - Public
User.unknown. - Example app with Cocoapods.
- Example app with Carthage.
- A new authorization in the Example app.
✈️ Offline mode insideInternetConnection.- Improved connection flow.
- Extension
Data.hex. - Extension
String.md5,String.url?. Filter.description.Sorting.description.- A variable
JSONDecoder.default. Now you can change the default JSON decoder. - Variables
JSONEncoder.defaultandJSONEncoder.defaultGzip. Now you can change default JSON encoders. - A channel for a direct messages will use a member avatar as default channel image by default.
- Docs for the
ClientLogger. - Hide a channel with clearing messages history.
- Added a new event
Event.channelHidden(HiddenChannelResponse, EventType).
- ComposerView position related to the keyboard with an opaque
UITabBar. - A proper way to check if members are empty.
November 27th, 2019
Fix tap on a link with disabled reactions.
November 27th, 2019
Client.channel(query: ChannelQuery)
ComposerViewand keyboard events crashes.ComposerViewposition for embeddedChatViewController.- Parse now can properly ignore bad channel name.
November 26th, 2019
- Layout
ComposerViewdepends on keyboard events.
- Token update.
November 23th, 2019
-
Added levels for
ClientLogger. -
Error Level:
-
ClientLogger.Options.requestsError -
ClientLogger.Options.webSocketError -
ClientLogger.Options.notificationsError -
ClientLogger.Options.error— all errors -
Debug Level:
-
ClientLogger.Options.requests -
ClientLogger.Options.webSocket -
ClientLogger.Options.notifications -
ClientLogger.Options.debug— all debug -
Info Level:
-
ClientLogger.Options.requestsInfo -
ClientLogger.Options.webSocketInfo -
ClientLogger.Options.notificationsInfo -
ClientLogger.Options.info— all info -
MessageViewStyle.showTimeThresholdto show additional time for messages from the same user at different times.
AdditionalDateStyle.messageAndDate . . . AdditionalDateStyle.userNameAndDate
-
Optimized MessageTableViewCell rendering.
-
Channel name. If it's empty:
-
for 2 members: the 2nd member name
-
for more than 2 members: member name + N others.
-
channel
id. -
Channel.isDirectMessage— checks if only 2 members in the channel and the channel name was generated. -
Improved work with
ExtraData. -
A custom
ChannelType.custom(String)
- Removed a
channelTypeparameter inChannelsPresenter.init. - Renamed
ExtraData.data->ExtraData.object Channel.currentUnreadCountupdate.
- Detecting and highlighting URL's in messages.
- Skip empty messages.
ChatFooterViewwith a white circle.- A user avatar missing.
November 14th, 2019
Fixed DataDetector.
November 14th, 2019
- The current user mentioned unread count
// The current unread count.
let count: Int = channel.currentMentionedUnreadCount
// An observable unread count.
channel.mentionedUnreadCount
.drive(onNext: { count in
print(count)
})
.disposed(by: disposeBag)- Map an observable value to void.
.void()
November 12th, 2019
- A custom data for
User. - Detect links in messages and open them in WebView.
November 11th, 2019
Fixed ComposerView for a keyboard position with different orientations and opaque Tabbar.
November 8th, 2019
Channel.currentUnreadCountvalue to show the number in table view.- Get a message by id:
Client.message(with messageId: String) - Mark all messages as reader:
Client.markAllRead() User.isInvisible- Flag/unflag users:
Client.flag(user: User)oruser.flag(). - Ban user:
Chanel.ban(user: User, timeoutInMinutes: Int? = nil, reason: String? = nil). - Channel ban options:
Channel. banEnabling:
/// Disabled for everyone.
case disabled
/// Enabled for everyone.
/// The default timeout in minutes until the ban is automatically expired.
/// The default reason the ban was created.
case enabled(timeoutInMinutes: Int?, reason: String?)
/// Enabled for channel members with a role of moderator or admin.
/// The default timeout in minutes until the ban is automatically expired.
/// The default reason the ban was created.
case enabledForModerators(timeoutInMinutes: Int?, reason: String?)- Event
userBanned - Debug info when API key is empty.
- More logs for Notifications errors.
ChannelPresenter. messageReadfor the current user.- Client API key property is public and mutable for development in different environments. Not recommended for production.
- Hiding the keyboard on landscape mode to add attachments.
- Message search.
- New flow to invite members to a channel:
// 1. Invite members with a creating of a new channel
let channel = Channel(type: .messaging,
id: "awesome-chat",
members: [tomasso, thierry]
invitedMembers: [nick])
channel.create().subscribe().disposed(by: disposeBag)
// 2. Invite user(s) to an existing channel.
channel.invite(nick).subscribe().disposed(by: disposeBag)ChannelsQuery:.messageLimit→.messagesLimit.User:.online→.isOnline.
ClientLoggerupdatedAtomicfrom:
typealias DidSetCallback = (T?) -> Voidto:
typealias DidSetCallback = (_ value: T?, _ oldValue: T?) -> VoidChannel.watch(options: QueryOptions = [])with query options.
BannerViewmemory leak.- A bug with the composer attachment button, when a channel config wasn't loaded.
- ComposerView position with opaque Tabbar.
- Reconnection after sleep for 10+ minutes.
- Popup menu for iPad.
- ReactionsView for iPhone in landscape orientation.
- ComposerView bottom constraint when iPhone on the landscape orientation.
October 24th, 2019
- Added events filter in presenters.
October 22th, 2019
- Update a channel data:
update(name: String? = nil, imageURL: URL? = nil, extraData: Codable? = nil) Channel.watch()
October 21th, 2019
- Response errors
- A crash of a date formatter for iOS 11.1 and below.
October 21th, 2019
ChannelIdtype (id: String+type: ChannelType).- Added
Channel.add(members:),Channel.remove(members:). ChannelsViewControllerwill update the table view with only invalidated rows or reload completely.ChannelPresenter.channelDidUpdateobservable (for example to get updated members).ChannelsViewControllerUI warnings. It tries to update itself when it's not in the hierarchy view.
- Changed
Client.userDidUpdateasDriver.

