In-app Chat
SDK Error Codes
On this page

ZIM upgrade Guide

2026-06-24

This article provides some instructions and considerations for upgrading the ZIM SDK for Windows version.

3.0.0 Upgrade Guide

Warning

This version (3.0.0) removes APIs that have been deprecated for over 1 year, along with related enum values and fields, and adds deprecation markers to some APIs. Please refer to the following instructions to complete the migration.

Removed deprecated APIs

ZIM initialization API (create)

The deprecated old create(appID, application) API has been removed. Please use the create API that accepts ZIMAppConfig instead.

ZIMAppConfig appConfig;
appConfig.appID = 12345678;
appConfig.appSign = "appSign";
ZIM *zim = ZIM::create(appConfig);

ZIM login API (login)

The deprecated old login(ZIMUserInfo, token, callback) API has been removed. Please use the login API that accepts userID and ZIMLoginConfig instead.

ZIMLoginConfig loginConfig;
loginConfig.userName = "userName";
loginConfig.token = ""; // Fill in the token if using token authentication
loginConfig.isOfflineLogin = false;
zim->login("userID", loginConfig, [=](const ZIMError &errorInfo) {
    // Login result
});

ZIM message sending API (sendMessage)

The deprecated sendPeerMessage, sendRoomMessage, sendGroupMessage, and old sendMessage API (without ZIMMessageSendNotification parameter) have been removed. Please use the sendMessage API with the notification parameter instead.

auto textMessage = std::make_shared<ZIMTextMessage>();
textMessage->message = "Hello";
ZIMMessageSendConfig config;
auto notification = std::make_shared<ZIMMessageSendNotification>();
notification->onMessageAttached = [=](const std::shared_ptr<ZIMMessage> &message) {
    // Business logic before message is sent
};
zim->sendMessage(textMessage, "toConversationID",
    ZIMConversationType::ZIM_CONVERSATION_TYPE_PEER, config, notification,
    [=](const std::shared_ptr<ZIMMessage> &message, const ZIMError &errorInfo) {
        // Message sent result
    });

ZIM media file download API (downloadMediaFile)

The deprecated old downloadMediaFile API (without config parameter) has been removed. Please use the new downloadMediaFile API with the ZIMMediaDownloadConfig parameter instead.

auto imageMessage = std::static_pointer_cast<ZIMImageMessage>(message);
ZIMMediaDownloadConfig config;
zim->downloadMediaFile(imageMessage,
    ZIMMediaFileType::ZIM_MEDIA_FILE_TYPE_ORIGINAL_FILE, config,
    [=](const std::shared_ptr<ZIMMessage> &msg,
        unsigned long long currentFileSize, unsigned long long totalFileSize) {
        // Download progress
    },
    [=](const std::shared_ptr<ZIMMessage> &msg, const ZIMError &errorInfo) {
        // Download complete
    });

ZIM message receive callback APIs

The onReceivePeerMessage, onReceiveRoomMessage, and onReceiveGroupMessage callbacks deprecated in 2.18.0 have been officially removed in this version. It is recommended to migrate to onMessageReceived.

virtual void onMessageReceived(ZIM *zim,
        const ZIMMessageReceivedEventResult &result) override {
    auto &messageList = result.messageList;
    auto &info = result.info;
    auto &conversationID = result.conversationID;
    auto conversationType = result.conversationType;
    // Handle messages for different conversation types based on conversationType
}

ZIM call invitation callback APIs

The old onCallInvitationTimeout(zim, callID), onCallInvitationRejected, onCallInvitationAccepted, and onCallInviteesAnsweredTimeout callbacks have been removed. Please use the new onCallInvitationTimeout and onCallUserStateChanged instead.

virtual void onCallInvitationTimeout(ZIM *zim,
        const ZIMCallInvitationTimeoutInfo &info,
        const std::string &callID) override {
    // info.mode can distinguish between normal mode and advanced mode
}

virtual void onCallUserStateChanged(ZIM *zim,
        const ZIMCallUserStateChangeInfo &info,
        const std::string &callID) override {
    // info.callUserList contains the list of users whose status changed
    // You can uniformly handle accept, reject, timeout, and other status changes
}

importLocalMessages / exportLocalMessages APIs removed

The importLocalMessages and exportLocalMessages APIs have been temporarily removed in version 3.0.0, and there is no replacement API at this time. This functionality will be re-enabled in future versions. Please follow the SDK release notes for updates.

ZIM message receive callback APIs

The onPeerMessageReceived, onRoomMessageReceived, and onGroupMessageReceived callbacks have been marked as deprecated in this version. They can still be used normally at present, but it is recommended to migrate to onMessageReceived as soon as possible.

virtual void onMessageReceived(ZIM *zim,
        const ZIMMessageReceivedEventResult &result) override {
    auto &messageList = result.messageList;
    auto &info = result.info;
    auto &conversationID = result.conversationID;
    auto conversationType = result.conversationType;
    // Handle messages for different conversation types based on conversationType
}

ZIMGroupConversation deprecated

The ZIMGroupConversation class has been deprecated in 3.0.0. The isDisabled and mutedExpiredTime fields should be replaced with the corresponding properties of the base class ZIMConversation:

ZIMGroupConversation (deprecated)ZIMConversation (replacement property)
isDisabledisConversationDisabled
mutedExpiredTimeselfMutedExpiredTime
bool isDisabled = conversation.isConversationDisabled;
long long mutedExpiredTime = conversation.selfMutedExpiredTime;

Enum value removals

ZIMMessageType enum value removed

SYSTEM (value 30) has been removed from the ZIMMessageType enum, and the ZIMSystemMessage class has also been removed. If you need to send system-level commands, please use ZIMCommandMessage instead.

// Use ZIMCommandMessage instead of ZIMSystemMessage
auto commandMessage = std::make_shared<ZIMCommandMessage>();
commandMessage->message = {/* payload bytes */};
zim->sendMessage(commandMessage, "toConversationID",
    ZIMConversationType::ZIM_CONVERSATION_TYPE_PEER,
    ZIMMessageSendConfig{}, nullptr,
    [=](const std::shared_ptr<ZIMMessage> &msg, const ZIMError &errorInfo) {});

ZIMCallUserState enum value removed

OFFLINE (value 4) has been removed from the ZIMCallUserState enum. Please check your code for any references to this enum value and remove them.

// The following enum value has been removed, please check and remove references to this value in your code
// ZIMCallUserState::ZIM_CALL_USER_STATE_OFFLINE  (value 4)

Field changes

ZIMUserFullInfo.userAvatarUrl deprecated

ZIMUserFullInfo.userAvatarUrl has been deprecated. Please use ZIMUserFullInfo.baseInfo.userAvatarUrl instead.

std::string avatarUrl = userFullInfo.baseInfo.userAvatarUrl;

ZIMMessage.conversationSeq replaced with messageSeq

ZIMMessage.conversationSeq has been removed. Please use ZIMMessage.messageSeq instead.

long long seq = message->messageSeq;

ZIMMessageDeletedInfo.isDeleteConversationAllMessage removed

ZIMMessageDeletedInfo.isDeleteConversationAllMessage has been removed. Please use ZIMMessageDeletedInfo.messageDeleteType instead.

ZIMMessageDeleteType deleteType = deletedInfo.messageDeleteType;
// Determine whether it is a single deletion or a full deletion through deleteType

ZIMGroupMemberInfo.memberAvatarUrl removed

ZIMGroupMemberInfo.memberAvatarUrl has been removed. Please use ZIMGroupMemberInfo.userAvatarUrl instead.

std::string avatarUrl = groupMemberInfo.userAvatarUrl;

ZIMGroupOperatedInfo structure change

The ZIMGroupOperatedInfo.operatedUserInfo field has been removed. Its internal fields have been flattened into ZIMGroupOperatedInfo, and can be accessed directly from ZIMGroupOperatedInfo.

// Get fields directly from ZIMGroupOperatedInfo
std::string operatorUserID = groupOperatedInfo.userID;
std::string operatorUserName = groupOperatedInfo.userName;
std::string operatorAvatarUrl = groupOperatedInfo.userAvatarUrl;

ZIMCallInvitationSentInfo.errorInvitees replaced

ZIMCallInvitationSentInfo.errorInvitees has been removed. Please use ZIMCallInvitationSentInfo.errorUserList instead. The type has changed from List<ZIMCallUserInfo> to List<ZIMErrorUserInfo>.

zim->callInvite(invitees, config,
    [=](const std::string &callID,
        const ZIMCallInvitationSentInfo &info,
        const ZIMError &errorInfo) {
        for (const auto &errorUser : info.errorUserList) {
            // errorUser.userID, errorUser.reason
        }
    });

ZIMConversationChangeInfo field change

The event property (type ZIMConversationEvent) in ZIMConversationChangeInfo has been removed. Please use the action property (type ZIMConversationChangeAction) in the same structure instead.

virtual void onConversationChanged(ZIM *zim,
        const ZIMConversationChangeEventResult &result) override {
    for (const auto &changeInfo : result.infoList) {
        ZIMConversationChangeAction action = changeInfo.action;
        // Handle conversation changes based on action
    }
}

API naming and signature changes

The following changes in 3.0.0 may cause compilation errors. Please make the corresponding modifications as prompted.

ZIMMessage getter method renames

The following getter methods in ZIMMessage have been renamed. After upgrading, you need to update the calling methods accordingly:

Old method nameNew method name
isUserInserted()getIsUserInserted()
isBroadcastMessage()getIsBroadcastMessage()
isServerMessage()getIsServerMessage()
isMentionAll()getIsMentionAll()
isGroupTargetedMessage()getIsGroupTargetedMessage()
bool isUserInserted = message->getIsUserInserted();
bool isBroadcastMessage = message->getIsBroadcastMessage();
bool isServerMessage = message->getIsServerMessage();
bool isMentionAll = message->getIsMentionAll();
bool isGroupTargetedMessage = message->getIsGroupTargetedMessage();

Callback interface method renames

Class serialization method change

Callback signature changes

The parameter signatures of the following event callbacks have changed. You need to update the implementation code accordingly:

onBlacklistChangedaction parameter removed const &:

virtual void onBlacklistChanged(ZIM *zim,
        const std::vector<ZIMUserInfo> &userList,
        ZIMBlacklistChangeAction action) override {}

onFriendListChangedaction parameter removed &:

virtual void onFriendListChanged(ZIM *zim,
        const std::vector<ZIMFriendInfo> &friendInfoList,
        ZIMFriendListChangeAction action) override {}

onFriendApplicationListChangedaction parameter removed &:

virtual void onFriendApplicationListChanged(ZIM *zim,
        const std::vector<ZIMFriendApplicationInfo> &applicationList,
        ZIMFriendApplicationListChangeAction action) override {}

onRoomMemberAttributesUpdatedoperatedInfo parameter added const &:

virtual void onRoomMemberAttributesUpdated(ZIM *zim,
        const std::vector<ZIMRoomMemberAttributesUpdateInfo> &infos,
        const ZIMRoomOperatedInfo &operatedInfo,
        const std::string &roomID) override {}

ZIMMessageRevokeConfig field rename

The config field in ZIMMessageRevokeConfig has been renamed to pushConfig. Please check and replace all related references.

ZIMMessageRevokeConfig revokeConfig;
ZIMPushConfig pushConfig;
pushConfig.title = "Notification title";
revokeConfig.pushConfig = pushConfig;

ZIMCombineMessageDetailQueriedCallback parameter change

The parameter signature of the ZIMCombineMessageDetailQueriedCallback callback has the following changes:

  • message parameter: changed from const std::shared_ptr<ZIMCombineMessage> & to std::shared_ptr<ZIMCombineMessage> (removed const &)
  • error parameter: changed from ZIMError & to const ZIMError & (added const)
zim->queryCombineMessageDetail(combineMessage,
    [=](std::shared_ptr<ZIMCombineMessage> message, const ZIMError &errorInfo) {
        // Handle result
    });

ZIMMessage.rootRepliedCount type change

The rootRepliedCount field type of ZIMMessage has changed from int to unsigned int. Please check your code for any logic involving assignment or comparison with signed integers for this field to avoid type conversion issues.

unsigned int count = message->rootRepliedCount;

Other method renames

ZIMTipsMessagePinStatusChangeInfoisPinned() renamed to getIsPinned():

bool isPinned = pinStatusChangeInfo->getIsPinned();

ZIMImageMessage — thumbnail size getter methods renamed:

int width = imageMessage->getThumbnailWidth();
int height = imageMessage->getThumbnailHeight();

Enum value renames

The following enum values have been renamed in 3.0.0. After upgrading, please check and replace all related references in your code.

ZIMCallUserState

ZIMMediaFileType

ZIMGroupMessageNotificationStatus

setRoomMembersAttributes behavior change

Starting from version 3.0.0, when setting room member attributes via setRoomMembersAttributes, if isDeleteAfterOwnerLeft is false, the room member attributes will not be deleted when the user leaves the room. In versions 2.x.x, attributes were first deleted when the user left the room and then restored when the user returned.


2.28.0 Upgrade Guide

Warning

ZIM SDK 2.28.0 version adjusts some return parameters and event callback triggering mechanisms. When upgrading from an older version to 2.28.0, please read the following guidelines.

Interface return parameter changes

ZIMMessageReactionUserListQueriedCallback callback will return the user reaction detail list type from ZIMMessageReactionUserInfo to ZIMMessageReactionUserFullInfo, which can be used for more detailed business UI display.

zim->queryMessageReactionUserList(message, config, 
        [=](const std::shared_ptr<ZIMMessage> &message,
// !mark
            const std::vector<ZIMMessageReactionUserFullInfo> &userInfoList,
            const std::string &reactionType, const long long nextFlag,
            const unsigned int totalCount, const ZIMError &errorInfo) {
        // Do business logic
});

Event callback triggering mechanism changes

Warning

The following callbacks have changed the triggering mechanism since version 2.28.0. It is recommended that developers check whether the corresponding business logic is affected after upgrading the SDK.

1

onMessageReactionsChanged

onMessageReactionsChanged callback will be triggered after the client calls addMessageReaction, deleteMessageReaction or deleteMessageAllReactions successfully.

2

onConversationChanged

onConversationChanged callback will be triggered after the client calls deleteConversation successfully.

3

onConversationsAllDeleted

onConversationsAllDeleted callback will be triggered after the client calls deleteAllConversations successfully.

2.27.0 Upgrade Guide

Warning

Starting from version 2.27.0, the following interfaces have undergone significant changes. Therefore, when upgrading from an earlier version to 2.27.0, please read the following guidelines.

The original queryGroupList interface now has an overloaded interface queryGroupList as a replacement. The new version of queryGroupList adds the count and config parameters, which can be used to query the list of groups that you have joined together.

The ZIMGroupListQueriedCallback callback adds the nextFlag parameter, which can be used as an anchor for paginated queries.

zim_->queryGroupList(
    [=](const std::vector<ZIMGroupInfo> &groupList, long long nextFlag, zim::ZIMError errorInfo){
        int error_code = errorInfo.code;
    });

2.19.0 upgrade guide

Warning

Starting from version 2.19.0, the following interfaces have undergone significant changes. Therefore, when upgrading from an older version to version 2.19.0, please read the following guidelines.

The original downloadMediaFile API is deprecated. Please use the new downloadMediaFile instead. The updated downloadMediaFile introduces a new config parameter, which can be used to specify the download of individual media content in multi-item messages.

In ZIMMediaDownloadingProgress and ZIMMediaDownloadedCallback, the message parameter type has changed from const std::shared_ptr<ZIMMediaMessage> & to const std::shared_ptr<ZIMMessage> & to support multi-item messages. Developers need to fix the calls according to the IDE's compile error hints.

// Assume multipleMessage.messageInfoList[0] is a text message, and multipleMessage.messageInfoList[1] is an image message
auto multipleMessage = std::static_pointer_cast<ZIMMultipleMessage>(message);
// !mark(1:3)
ZIMMediaDownloadConfig config;
// Specify to download the image message
config.messageInfoIndex = 1;

ZIM::getInstance()->downloadMediaFile(multipleMessage,
                                     ZIMMediaFileType::ZIM_MEDIA_FILE_TYPE_ORIGINAL_FILE,
// !mark(1:2)
                                     config,
                                     [=](const std::shared_ptr<ZIMMessage> &message, unsigned long long currentFileSize, unsigned long long totalFileSize) {
                                         // Download Progress
                                         // Developers need to check the type of the message and cast it to the corresponding message type
                                         if (message->getType() == ZIMMessageType::ZIM_MESSAGE_TYPE_MULTIPLE) {
                                             auto multipleMessage = std::static_pointer_cast<ZIMMultipleMessage>(message);
                                             // Handle multi-item messages
                                         }
                                         // Handle other message types
                                         ......
                                     },
// !mark
                                     [=](const std::shared_ptr<ZIMMessage> &message, const ZIMError &errorInfo) {
                                         // Download completed
                                         // Developers need to check the type of the message and cast it to the corresponding message type
                                         if (message->getType() == ZIMMessageType::ZIM_MESSAGE_TYPE_MULTIPLE) {
                                             auto multipleMessage = std::static_pointer_cast<ZIMMultipleMessage>(message);
                                             // Handle multi-item messages
                                         }
                                         // Handle other message types
                                         ......
                                     });

sendMediaMessage

Since version 2.19.0, multimedia messages must be sent using the sendMessage interface. The sendMediaMessage interface is deprecated to unify message sending and facilitate future general extensions.

auto imageMessage = std::static_pointer_cast<ZIMImageMessage>(message);
ZIMMessageSendConfig config;
config.priority = ZIMMessagePriority::ZIM_MESSAGE_PRIORITY_MEDIUM;

// !mark
auto notification = std::make_shared<ZIMMessageSendNotification>();
notification->onMessageAttached = [=](const std::shared_ptr<ZIMMessage> &message) {
    // Developers can listen to this callback to execute business logic before sending the message
};
notification->onMediaUploadingProgress = [=](const std::shared_ptr<ZIMMediaMessage> &message, unsigned long long currentFileSize, unsigned long long totalFileSize) {
    // Upload Progress
};

// !mark
ZIM::getInstance()->sendMessage(imageMessage, 
                               "TO_CONVERSATION_ID", 
                               ZIMConversationType::ZIM_CONVERSATION_TYPE_PEER, 
                               config, 
                               notification, 
                               [=](const std::shared_ptr<ZIMMessage> &message, const ZIMError &errorInfo) {
                                   // Message Send Result
                               });

2.18.0 upgrade guide

Warning

Starting from version 2.18.0, the following interfaces have undergone significant changes. Therefore, when upgrading from an older version to version 2.18.0, please read the following guidelines.

Callback on receiving one-to-one messages

The deprecated callback onReceivePeerMessage for receiving one-to-one messages has been replaced by onPeerMessageReceived.

The new callback supports the following features:

  • When a user is online, they can receive one-to-one messages through this callback.
  • When a user logs back into the ZIM SDK, they can receive all one-to-one messages received during their offline period (up to 7 days).
// New callback
virtual void 
onPeerMessageReceived(ZIM * /*zim*/, 
                        const std::vector<std::shared_ptr<ZIMMessage>> & /*messageList*/,
                        const ZIMMessageReceivedInfo & /*info*/, 
                        const std::string & /*fromUserID*/) {}

// Old callback
virtual void
onReceivePeerMessage(ZIM * /*zim*/,
                        const std::vector<std::shared_ptr<ZIMMessage>> & /*messageList*/,
                        const std::string & /*fromUserID*/) {}

Callback on receiving room messages

The deprecated callback onReceiveRoomMessage for receiving room messages has been replaced by onRoomMessageReceived.

The new callback supports the following features:

  • When a user is online, they can receive online room messages through this callback.
  • When a user goes from offline to online and is still in the room, they can receive all room messages that were sent during their offline period through this callback.
// New callback
virtual void 
onRoomMessageReceived(ZIM * /*zim*/, 
                        const std::vector<std::shared_ptr<ZIMMessage>> & /*messageList*/,
                        const ZIMMessageReceivedInfo & /*info*/, 
                        const std::string & /*fromRoomID*/) {}

// Old callback
virtual void
onReceiveRoomMessage(ZIM * /*zim*/,
                        const std::vector<std::shared_ptr<ZIMMessage>> & /*messageList*/,
                        const std::string & /*fromRoomID*/) {}

Callback on receiving group messages

The deprecated callback onReceiveGroupMessage for receiving group messages has been replaced by onGroupMessageReceived.

The new callback supports the following features:

  • When the user is online, they can receive online group messages through this callback.
  • When the user logs back into the ZIM SDK, they can receive all group chat messages received during the offline period (up to 7 days) through this callback.
// New callback
virtual void onGroupMessageReceived(ZIM * /*zim*/, 
                                        const std::vector<std::shared_ptr<ZIMMessage>> & /*messageList*/,
                                        const ZIMMessageReceivedInfo & /*info*/, 
                                        const std::string & /*fromGroupID*/) {}

// New callback
virtual void onReceiveGroupMessage(ZIM * /*zim*/, 
                                    const std::vector<std::shared_ptr<ZIMMessage>> & /*messageList*/, 
                                    const std::string & /*fromGroupID*/) {}

2.16.0 Upgrade Guide

Warning

Starting from version 2.16.0, there are significant changes to the following interfaces. Therefore, when upgrading from an older version to version 2.16.0, please read the following guide.

callCancel

Note

The following changes only apply to advanced mode call invitations.

In the new version of callCancel, if the parameter userIDs contains a userID, this interface will only cancel the invitation for that callee. If the userIDs parameter is empty, this interface will cancel the invitation for all callees.

For the old version of the callCancel interface, regardless of whether the userIDs parameter is empty or not, it is considered as canceling the invitation for all callees.

Since the old version of the ZIM SDK is not compatible with separate cancellation logic, if you need to retain the cancellation logic implemented using the old version of ZIM and also need to use the separate cancellation feature of the new version, please isolate the call functionality between the old and new versions of ZIM.

// Cancel userIdA and userIdB separately
std::vector<std::string> invitees;
invitees.emplace_back("userIdA");
invitees.emplace_back("userIdB");
ZIMCallCancelConfig config;
zim->callCancel(invitees, "callID", config, [=](const std::string& callID, const std::vector<std::string>& errorInvitees,
    const ZIMError& errorInfo) {
});

// Cancel the entire call invitation, can be called successfully when none of the callees in the call have accepted
std::vector<std::string> invitees;
ZIMCallCancelConfig config;
zim->callCancel(invitees, "callID", config, [=](const std::string& callID, const std::vector<std::string>& errorInvitees,
    const ZIMError& errorInfo) {
});

Previous

ZIM release notes

Next

Authentication

On this page

Back to top