Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

Changelog: Twilio Chat iOS SDK

Latest releases for the Programmable Chat iOS SDK

We recommend using these links in your projects. As we patch bugs, these links will automatically be updated with the fixes.

Programmable Chat iOS v2.4

Access Manager iOS v1.1

Upgrade to Programmable Chat iOS SDK v2.0 or higher.

From June 1, 2019 forward, iOS SDKs earlier than v2.0 will be deprecated and cease to connect to the Twilio backend. If you still use Chat's 0.x or 1.x iOS SDKs, please leverage our migration guides and update to a later version at your nearest convenience.

With the release of Chat iOS 2.4.2 SDK the standalone AccessManager is no longer necessary; its functionality is now integrated into the Chat SDK. Your old implementations that use AccessManager will continue to operate normally, until you implement two new methods on TwilioChatClientDelegate - chatClientTokenWillExpire: and chatClientTokenExpired:. After that, you can safely remove AccessManager from your project.

In response to these new delegate methods calls you should query an updated token and set it on your chatClient instance by using [TwilioChatClient updateToken:] method. For more information, see Access Token Lifecycle.

Change Logs

Links are provided to specific patch versions here. We don't recommend using these links unless you have a specific need for a certain patch of a release.

Programmable Chat iOS 2.4.6 (April 11, 2019)


  • Improved connection reliability under bad network conditions.
  • Fixed unexpected connectivity errors with code 1401: Unable to establish connection to Twilio Sync service.

Programmable Chat iOS 2.4.5 (February 15, 2019)


  • SDK size reduction - it gained over the course of the year, so we sent it to the gym. Native libraries are now repackaged and optimized for size.

Programmable Chat iOS 2.4.4 (January 31, 2019)


  • Fixed strong reference to TCHChannel's delegate that could prevent Chat library from properly shutting down
  • Improved stability

Programmable Chat iOS 2.4.3 (January 21, 2019)


  • Fixed crash on restoring after disconnected or backgrounded state
  • Fixed memory leaks in media upload

Programmable Chat iOS 2.4.2 (December 6, 2018)


  • Introduced Push Notification Muting, with per-channel user notification preferences. A channel's notificationLevel can be either TCHChannelNotificationLevelDefault to receive notifications or TCHChannelNotificationLevelMuted to suppress them.
  • added TCHChannelUpdateUserNotificationLevel to TCHChannelUpdate enum - this update is triggered when channel's notification level is changed.

  • NOTE: You need to grant EditNotificationLevel permission to the user roles to be able to change this setting. See the Chat Permissions documentation.

  • Added new token lifecycle management delegate callbacks which reduce the need for TwilioAccessManager integration when only using one Twilio client SDK:

    • chatClientTokenWillExpire: is called when a token has 3 minutes or less left until expiry and should be refreshed
    • chatClientTokenExpired: is called when a token is already expired and must be refreshed to reconnect to the service
  • New logging level, TCHLogLevelTrace, which provides the most verbose logging level for diagnostics. Use this value to generate logs when reporting SDK issues to Twilio. As before, default log setting is TCHLogLevelSilent, producing no SDK debug output at all.

  • Added TCHMemberUpdateAttributes to TCHMemberUpdate enum. There's currently no way to query member attributes, it will be added in the following SDK version.

  • Overhauled transport and communication layer, significantly reducing network traffic overhead and improving client performance.

  • Provided numerous fixes for improving client stability, focusing on runtime and shutdown crashes.

Programmable Chat iOS 2.3.3 (July 19, 2018)


  • Updates to shutdown procedure to prevent crashes in rare cases during client disposal.

Programmable Chat iOS 2.3.2 (July 3, 2018)


Programmable Chat iOS 2.3.1 (June 19, 2018)


  • Resolved an issue where calling one of the getMessages* could result in a crash if called while client was shutting down.

Programmable Chat iOS 2.3.0 (June 6, 2018)


  • Added metadata about the most recently sent message to TCHChannel:
    • lastMessageDate - the NSDate timestamp of the most recent message on the channel
    • lastMessageIndex - the index of the most recent message on the channel
  • Added method to return a sorted list of the user's subscribed channels:
    • - (nonnull NSArray<TCHChannel *> *)subscribedChannelsSortedBy:(TCHChannelSortingCriteria)criteria order:(TCHChannelSortingOrder)order
  • Added sorting criteria and order enumerations for new sort method:
    • TCHChannelSortingCriteriaLastMessage
    • TCHChannelSortingCriteriaFriendlyName
    • TCHChannelSortingCriteriaUniqueName
    • TCHChannelSortingOrderAscending
    • TCHChannelSortingOrderDescending
  • Added new TCHChannelUpdateLastMessage update type for chatClient:channel:updated: delegate method
  • Resolved an issue where calling one of the getMessages* methods for a channel whose last remaining message was deleted could cause a crash
  • Added additional protections against crashes when the client is disposed during startup
  • Bug fixes and performance updates

Programmable Chat iOS 2.2.3 (May 15, 2018)


  • Privacy by default in logging for GDPR. A new logging level has been introduced, TCHLogLevelSilent, which is also the new default level. We strongly encourage customers use this logging level for production builds especially if serving European customers.
  • Fix for crashes related to logging while the chat client was being disposed.
  • Fix for crashes related to delegate events while the chat client was being disposed.
  • Fix for notifications where channel SID would sometimes be invalid.

Programmable Chat iOS 2.2.2 (April 17, 2018)


  • Addressed possible issue where the Chat Client is disposed during startup.

Access Manager iOS 1.1.2 (April 17, 2018)


  • Addressed issue where Access Manager could try to call methods on disposed delegate objects.

Programmable Chat iOS 2.2.1 (March 23, 2018)


  • Resolved issue where passing nil to push token method parameters could lead to a crash.
  • Resolved issue where user parameter returned by TCHUserDescriptor's subscribe method could be nil.
  • Resolved potential memory leak when uploading media.

Access Manager iOS 1.1.1 (March 14, 2018)


  • Added static helper methods for evaluating token expiry:
    • + (BOOL)isExpired:(nonnull NSString *)token
    • + (BOOL)isExpiring:(nonnull NSString *)token
  • Resolved an issue with some identities containing '?' resulting in not getting token expiry events

Programmable Chat iOS 2.2.0 (December 21, 2017)


  • Dates would sometimes not parse correctly for some locales depending on the date format, resulting in nil date objects – they parse consistently now.
  • The body attribute of messages containing media included the placeholder message intended for legacy client versions, potentially incorrectly inferring the client version did not support media attachments. body will now be nil if the TCHMessage has media content.
  • Expanded callbacks delivered from TwilioChatClient to support three new notifications:
    • Added to channel notification: - (void)chatClient:(nonnull TwilioChatClient *)client notificationAddedToChannelWithSid:(nonnull NSString *)channelSid
    • Invited to channel notification: - (void)chatClient:(nonnull TwilioChatClient *)client notificationInvitedToChannelWithSid:(nonnull NSString *)channelSid
    • Removed from channel notification: - (void)chatClient:(nonnull TwilioChatClient *)client notificationRemovedFromChannelWithSid:(nonnull NSString *)channelSid;
  • chatClient:notificationNewMessageReceivedForChannelSid:messageIndex: now consistently returns message index when a new message is received.
  • Added .sid identifier to TCHMember objects.

Programmable Chat iOS 2.1.0 (November 9, 2017)


  • BEHAVIORAL CHANGE: Bug-fix for calling TCHChannel's joinWithCompletion: or TCHMember's addByIdentity:completion: will now correctly return with a failure result if the user/identity is already a member of the channel instead of success.
  • Updating the consumption horizon now provides the updated unconsumed message count.

The following methods have been deprecated and for now have the same effect as passing null/nil to the optional completion parameters introduced below:

- (void)setLastConsumedMessageIndex:(nonnull NSNumber *)index;
- (void)advanceLastConsumedMessageIndex:(nonnull NSNumber *)index;
- (void)setAllMessagesConsumed;
- (void)setNoMessagesConsumed;

These methods are replaced with versions that take an optional completion block:

- (void)setLastConsumedMessageIndex:(nonnull NSNumber *)index completion:(nullable TCHCountCompletion)completion;
- (void)advanceLastConsumedMessageIndex:(nonnull NSNumber *)index completion:(nullable TCHCountCompletion)completion;
- (void)setAllMessagesConsumedWithCompletion:(nullable TCHCountCompletion)completion;
- (void)setNoMessagesConsumedWithCompletion:(nullable TCHCountCompletion)completion;

The completion block will convey the newly updated unread message count for the channel for the current user. These operations will also affect the value returned by TCHChannel's getUnconsumedMessagesCountWithCompletion: method, causing the value returned by it to be up to date as of the consumption update the user just performed.

Programmable Chat iOS 2.0.1 (October 11, 2017)


  • Both chat client creation and updateToken:completion: once again give feedback if the provided token is expired or otherwise invalid.
  • Re-connection to the chat server will occur faster when bringing the application to the foreground or the device's network connection recovering while in the application.
  • Fixed an issue where the completion for joinChannel sometimes was not called.
  • Fixed an issue where properties of TCHMessage were sometimes not fully populated by the time sendMessage's completion was called.
  • Fixed an infrequently occurring crash on chat client startup.

Programmable Chat iOS 2.0.0 (September 18, 2017)

Important: The behavior of not-present optional data, such as friendlyName, uniqueName, etc, has changed with this release of Programmable Chat iOS to match the REST API and improve usability in Swift. We no longer return an empty string on missing data, returning instead nil. If you are relying on the previous behavior of empty string to be able to directly display these values in your application, you will need to check for the value instead.

With 2.x, we are moving Programmable Chat iOS releases to the global CocoaPods repository. We will no longer be posting non-beta releases for this SDK to the location. If you already have the global CocoaPods source in your Podfile no changes are necessary. If you do not have it, you will need to add source '' or remove the Twilio specific source line. No changes are necessary if you use manual integration of this SDK.


  • Added Multimedia Messaging (beta) API (see Media Support for more information). Note: Sending media messages on existing instances requires adding a new permission in your channel roles.
  • With the addition of support for iOS 11, we are deprecating support for iOS 8 in Programmable Chat iOS 2.x
  • chatClient:channel:updated: will no longer notify on TCHChannelUpdateSynchronizationStatus changes - see the chatClient:channel:synchronizationStatusUpdated: delegate call for these updates
  • Creation of new messages is no longer a two-step process, createMessageWithBody: is deprecated from TCHMessages. You now build a new message using the TCHMessageOptions object and send with sendMessageWithOptions:completion:


    TCHMessage *message = [channel.messages createMessageWithBody:@"hello"];
    [channel.messages sendMessage:message completion:^(TCHResult *result) { }];


    TCHMessageOptions *options = [[TCHMessageOptions new] withBody:@"hello"];
    [channel.messages sendMessageWithOptions:options completion:^(TCHResult *result, TCHMessage *message) { }];
  • Nullability hints and behavior have changed for the sdk. SDK methods will accept either nil or an empty string as an argument for clearing data but will consistently return nil when there is no data set for an optional field to improve usability. This applies to dates and user, channel and message attributes as well.

Interface Changes

Changes to nullability hints throughout entire public interface.

  • TCHChannelUpdateSynchronizationStatus (REMOVED - see chatClient:channel:synchronizationStatusUpdated:)
TCHMessageType (ADDED)
  • TCHMessageTypeText
  • TCHMessageTypeMedia
TCHMediaOnStarted (ADDED)
TCHMediaOnProgress (ADDED)
TCHMediaOnCompleted (ADDED)
  • messageType (ADDED)
  • mediaSid (ADDED)
  • mediaSize (ADDED)
  • mediaType (ADDED)
  • mediaFilename (ADDED)
  • -hasMedia (ADDED)
  • -getMediaWithOutputStream:onStarted:onProgress:onCompleted:completion: (ADDED)
  • -createMessageWithBody: (REMOVED)
  • -sendMessage:completion: migrated to -sendMessageWithOptions:completion: - completion now provides a handle to the new TCHMessage

Access Manager iOS 1.0.0 (September 18, 2017)


With 1.x, we are moving Access Manager releases to the global CocoaPods repository. We will no longer be posting non-beta releases for this SDK to the location. If you already have the global CocoaPods source in your Podfile no changes are necessary. If you do not have it, you will need to add source '' or remove the Twilio specific source line. No changes are necessary if you use manual integration of this component.

Legacy Versions

Programmable Chat iOS v1.0

Programmable Chat iOS 1.0.10 (February 6, 2018)


  • Updated internal certificate store for upcoming certificate authority changes.

Programmable Chat iOS 1.0.9 (October 11, 2017)


  • Both chat client creation and updateToken:completion: once again give feedback if the provided token is expired or otherwise invalid.
  • Re-connection to the chat server will occur faster when bringing the application to the foreground or the device's network connection recovering while in the application.
  • Fixed an issue where the completion for joinChannel sometimes was not called.
  • Fixed an issue where properties of TCHMessage were sometimes not fully populated by the time sendMessage's completion was called.

Programmable Chat iOS 1.0.8 (September 15, 2017)


  • Resolved issue when updating token on chat client after token expiry.

Programmable Chat iOS 1.0.7 (August 9, 2017)


  • Performance enhancements
  • Resolved possible crash during client creation if initialization takes an especially long time

Programmable Chat iOS 1.0.6 (July 25, 2017)


  • Completion handler for TCHChannel's join method will be delayed until the channel is fully synchronized, guaranteeing availability of members and messages objects.

Programmable Chat iOS 1.0.5 (July 17, 2017)


  • Fixed issues related to thread management, which in many cases should lead to significant performance gains.
  • Fixed crashes possible during client shutdown.

Programmable Chat iOS 1.0.4 (June 21, 2017)


  • Fix bug where TCHChannel’s chatClient:channel:synchronizationStatusUpdated: delegate method was not called.
  • Added channel synchronization status method to chat client delegate.
  • Trigger channel’s synchronization status delegate method every time a channel delegate is assigned for convenience.
  • Resolved issue where TCHMessages' getLastMessagesWithCount:completion: could hang.

Programmable Chat iOS 1.0.3 (June 8, 2017)


  • Fixed a bug whereby client initialization did not completed correctly - i.e. no success nor failure callback was received for client creation. This was for cases not fixed in the previous release.
  • Fixed an issue whereby the SDK could crash in some cases when creating a new Chat Client instance.

Programmable Chat iOS 1.0.2 (June 2, 2017)


  • Fixed a bug whereby client initialization did not completed correctly - i.e. no success nor failure callback was received for client creation
  • Fixed a bug whereby some commands did not correctly complete - i.e. no success callback nor failure was received

Programmable Chat iOS 1.0.1 (May 24, 2017)


  • Fixed a bug whereby after a call to the client's shutdown sometimes caused New Message push registrations to be lost for the endpoint.

Programmable Chat iOS 1.0.0 (May 2, 2017)




  • userInfo migrated to user
  • chatClientWithToken:properties:delegate: migrated to chatClientWithToken:properties:delegate:completion:
  • updateToken: migrated to updateToken:completion:
  • users (ADDED)
  • registerWithToken: migrated to registerWithNotificationToken:completion:
  • deregisterWithToken: migrated to deregisterWithNotificationToken:completion:
  • handleNotification: migrated to handleNotification:completion:

TCHTwilioClientCompletion (ADDED)


  • synchronizationStrategy (REMOVED)
  • initialMessageCount (REMOVED)


  • chatClient:connectionStateChanged: renamed to chatClient:connectionStateUpdated:
  • chatClient:synchronizationStateChanged: renamed to chatClient:synchronizationStateUpdated:
  • chatClient:channelChanged: migrated to chatClient:channel:updated:
  • chatClient:channel:synchronizationStatusChanged:
  • chatClient:channel:memberChanged: renamed to chatClient:channel:member:updated:
  • chatClient:channel:messageChanged: migrated to chatClient:channel:message:updated:
  • chatClientToastSubscribed: (REMOVED)
  • chatClient:toastRegistrationFailedWithError: (REMOVED)
  • chatClient:toastReceivedOnChannel:message: migrated to chatClient:notificationNewMessageReceivedForChannelSid:messageIndex:
  • chatClient:user:updated: (ADDED)
  • chatClient:userSubscribed: (ADDED)
  • chatClient:userUnsubscribed: (ADDED)


  • synchronizeWithCompletion: (REMOVED)

TCHChannelDelegate (CHANGED)

  • chatClient:channelChanged: migrated to chatClient:channel:updated:
  • chatClient:channel:synchronizationStatusChanged: renamed to chatClient:channel:synchronizationStatusUpdated:
  • chatClient:channel:memberChanged: renamed to chatClient:channel:member:updated:
  • chatClient:channel:messageChanged: migrated to chatClient:channel:message:updated:
  • chatClient:channel:member:userInfo:updated: migrated to chatClient:channel:member:user:updated:
  • chatClient:channel:member:userSubscribed: (ADDED)
  • chatClient:channel:member:userUnsubscribed: (ADDED)


  • userChannelsWithCompletion: (REMOVED)
  • subscribedChannels (ADDED)
  • userChannelDescriptorsWithCompletion: (ADDED)
  • publicChannelsWithCompletion: renamed to publicChannelDescriptorsWithCompletion:

TCHChannelUpdate (ADDED)


  • TCHChannelStatusUnknown (ADDED)

TCHChannelPaginator -> TCHChannelDescriptorPaginator (RENAMED)

TCHChannelPaginatorCompletion (REMOVED)


  • userInfo migrated to identity
  • userDescriptorWithCompletion: (ADDED)
  • subscribedUserWithCompletion: (ADDED)

TCHMemberUpdate (ADDED)

TCHMessageUpdate (ADDED)


  • resultCode (ADDED)
  • resultText (ADDED)


  • userDescriptorsForChannel:completion:
  • userDescriptorWithIdentity:completion:
  • subscribedUserWithIdentity:completion:
  • subscribedUsers


  • isSubscribed (ADDED)
  • unsubscribe (ADDED)

TCHUserInfo -> TCHUserDescriptor (MIGRATED)

  • subscribeWithCompletion: (ADDED)
  • setAttributes:completion: (REMOVED)
  • setFriendlyName:completion: (REMOVED)

TCHUserCompletion (ADDED)

TCHUserDescriptorCompletion (ADDED)

TCHUserDescriptorPaginatorCompletion (ADDED)

TCHUserInfoUpdate -> TCHUserUpdate (CHANGED)

Programmable Chat iOS 0.17.3 (May 19, 2017)


  • Fix for absence of channel added delegate when a private channel is created from a separate endpoint.

Programmable Chat iOS 0.17.2 (April 3, 2017)


  • The iOS SDK now supports badging when enabled on your Chat instance for clients you have registered for push notifications. Badges will indicate the number of unread 1:1 channels the user has.
  • Resolved an issue where the client creation call and updateToken calls may perform a network operation on the calling thread, blocking it. These operations now occur in the background and the calls once again return immediately.
  • Introduced callback for badge updates on iOS. This delegate method will be called as a result of the chat library processing a notification via TwilioChatClient’s handleNotification: method where the badge count updates. When your application is foregrounded, iOS will not automatically update the springboard badge count on its own so your application must manually update it. If your application receives its badge updates through a mechanism other than Twilio, you can omit this delegate method and handle this event in another way. See chatClient:notificationUpdatedBadgeCount: in the SDK docs or [demo application] for more information including a sample implementation.

Programmable Chat iOS 0.17.1 (February 23, 2017)


  • The endpoint_id identifier specified in access tokens is now automatically generated and persisted in the keychain. The following should be observed with this change:
    • endpoint_id is no longer a required identifier in your generated access tokens, you may omit it from this build forward
    • endpoint_id will be ignored if specified with your access token
    • When running in the iOS simulator only, the automatically generated endpoint_id may not persist between runs to the simulator keychain without this [work-around]
  • If a client is initially created with an invalid access token, creation will fail and nil will be returned for the client instance
  • Resolved an issue where APNS registrations for the user may be lost after shutdown of the client. Ensure when you are logging a user fully out of an application that registers for push notifications you call deregisterWithToken: with the device's token prior to shutdown to prevent messages continuing to be delivered to the device.
  • Resolved an issue where crashes could occur during client shutdown, in particular while in the background
  • Security enhancements

Access Manager iOS 0.1.3 (February 14, 2017)


  • Resolved issue where invalid tokens could cause a crash when foregrounding the application after being in the background.

Programmable Chat iOS 0.16.1 (January 30, 2017)


  • Resolved potential incompatibility with other Twilio SDKs in the same project
  • Fix for channel added events not occurring with synchronization strategy .ChannelList

Access Manager iOS 0.1.2 (December 6, 2016)


  • Resolved issue with Framework short version string

Programmable Chat iOS 0.16.0 (November 21, 2016)


  • TwilioIPMessagingClient -> TwilioChatClient
  • All TWM class prefixes to TCH
  • AccessManager is removed from the SDK and provided as a stand-alone helper library
  • Channels are now split between Public and User channels list.
    • Unjoined public channels no longer fire channel added/removed/changed events
  • Migration to asynchronous-only access to most entities within system
    • Includes addition of paging to User and Public channels list as well as channel Members


TwilioChatClient (CHANGED)

  • updateToken method


  • createdBy property
  • memberWithIdentity method
  • getUnconsumedMessagesCountWithCompletion:
  • getMessagesCountWithCompletion:
  • getMembersCountWithCompletion:


  • allObjects
  • userChannelsWithCompletion:
  • publicChannelsWithCompletion:
  • channelWithId:
  • channelWithUniqueName:
  • channelWithSidOrUniqueName:completion:

TCHChannelDescriptorPaginatorCompletion (ADDED) TCHChannelPaginatorCompletion (ADDED) TCHMemberPaginatorCompletion (ADDED) TCHChannelCompletion (ADDED)

TCHChannelDescriptor (ADDED) TCHChannelDescriptorPaginator

TCHChannelPaginator (ADDED)

TCHMemberPaginator (ADDED)


  • allObjects
  • membersWithCompletion:


  • allObjects
  • getMessageWithIndex:
  • getMessageWithIndex:completion:
  • messageForConsumptionIndex:
  • messageForConsumptionIndex:completion:

If you are looking for the archived IP Messaging iOS changelog, it can be found here.

Rate this page:

Need some help?

We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.