• UIKit
  • SDK
  • 服务端 API
Chat/
SDK/
Android/
消息/
SDK
  • 集成 SDK
  • 初始化
  • 登录登出
  • 消息
    • 介绍
    • 发送消息
    • 接收消息
    • 历史消息
    • 转发消息
    • 消息变更
    • 插入消息
    • 删除消息
    • 清空消息
    • 撤回消息
    • 在线消息
    • 已读回执
    • 查询消息
    • 群 @ 消息
    • 群定向消息
    • 消息免打套
    • 消息扩展
    • 消息回应
    • 消息翻译
    • 消息置顶
  • 会话
    • 介绍
    • 会话列表
    • 获取会话
    • 会话未读数
    • 置顶会话
    • 删除会话
    • 会话草稿
    • 会话标记
    • 会话分组
  • 群组
    • 介绍
    • 管理群组
    • 群资料
    • 管理群成员
    • 群成员资料
    • 自定义属性
    • 群计数器
  • 社群话题
    • 管理社群
    • 权限组
  • 用户
    • 用户资料
    • 用户状态
    • 管理好友
    • 好友分组
    • 黑名单
    • 关注与粉丝
  • 本地搜索
    • 搜索消息
    • 搜索好友
    • 搜索群组
    • 搜索群成员
  • 信令
  • 客户端 API
    • Java
  • 开发指引
  • 控制台指南
    • 创建和升级应用
    • 基本配置
    • 功能配置
    • 账号管理
    • 群组管理
    • 回调配置
  • 产品介绍
    • 消息管理
      • 单聊消息
      • 消息存储
      • 离线推送
      • 群消息
      • 消息格式
    • 账号系统
      • 登陆验证
      • 在线状态管理
    • 群相关
      • 群组系统
      • 群组管理
    • 用户资料和关系链
      • 资料管理
      • 关系链管理
  • 购买指南
    • 计费概述
    • 价格中心
  • 错误码

消息回应

功能描述

消息回应功能是指对某条消息进行互动回应,典型的场景就是表情回应。表情回应是通过表情符号对消息进行互动,我们可以在回应详情中看到具体的回应人数和回应人列表。
说明
该功能仅对进阶版客户开放,购买进阶版后可使用。
该功能仅增强版 SDK 7.4 及以上版本支持。

效果展示

您可以使用本功能实现如下的表情回应效果:




接口说明

您可以基于 SDK API 实现表情回应能力,主要操作如下:
调用 addMessageReaction 接口为一条消息添加一个 emoji,添加成功后,emoji 下就会存储当前操作用户。
调用 removeMessageReaction 接口删除已经添加的 emoji,删除成功后,emoji 下就不再存储当前操作用户。
调用 getMessageReactions 接口批量拉取多条消息的 emoji 列表,其中每个 emoji 都包含了当前使用者总人数以及前 N(默认 10)个使用者用户资料。
调用 getAllUserListOfMessageReaction 接口分页拉取消息 emoji 的全量使用者用户资料。
监听 onRecvMessageReactionsChanged 回调,感知 emoji 的使用者信息变更,该回调会携带 emoji 最新的使用者信息(包含使用者总人数以及前 N 个使用者用户资料)。
具体的使用说明参见下文所述。

添加消息回应

调用addMessageReaction (Android / iOS & Mac / Windows) 接口可以添加消息回应。
添加消息回应接口入参详解如下:
属性
含义
说明
message
消息对象
消息必须是发送成功的状态。
reactionID
消息回应 ID
在表情回应场景,reactionID 为表情 ID。
说明
1. 单条消息最大支持 10 个 Reaction,单个 Reaction 最大支持 100 个用户。
2. 如果单条消息 Reaction 数量超过最大限制,调用接口会报 ERR_SVR_MSG_REACTION_COUNT_LIMIT 错误。
3. 如果单个 Reaction 用户数量超过最大限制,调用接口会报 ERR_SVR_MSG_REACTION_USER_COUNT_LIMIT 错误。
4. 如果 Reaction 已经包含当前用户,调用接口会报 ERR_SVR_MSG_REACTION_ALREADY_CONTAIN_USER 错误。
示例代码如下:
Android
iOS & Mac
Windows
V2TIMManager.getMessageManager().addMessageReaction(message, "emoji", new V2TIMCallback() {
    @Override
    public void onSuccess() {
// add message reaction succ
    }
    @Override
    public void onError(int code, String desc) {
// add message reaction failed
}
});
[[V2TIMManager sharedInstance] addMessageReaction:message reactionID:@"emoji" succ:^{
    // add message reaction succ
} fail:^(int code, NSString *desc) {
    // add message reaction failed
}];
class Callback final : public V2TIMCallback {
public:
    using SuccessCallback = std::function<void()>;
    using ErrorCallback = std::function<void(int, const V2TIMString &)>;
    Callback() = default;
    ~Callback() override = default;
    void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
        success_callback_ = std::move(success_callback);
        error_callback_ = std::move(error_callback);
    }
    void OnSuccess() override {
        if (success_callback_) {
            success_callback_();
        }
    }
    void OnError(int error_code, const V2TIMString &error_message) override {
        if (error_callback_) {
            error_callback_(error_code, error_message);
        }
    }
private:
    SuccessCallback success_callback_;
    ErrorCallback error_callback_;
};

auto *callback = new Callback{};
callback->SetCallback(
    [=]() {
        // add message reaction succ
        delete callback;
    },
    [=](int error_code, const V2TIMString &error_message) {
        // add message reaction failed
        delete callback;
    });
V2TIMManager::GetInstance()->GetMessageManager()->AddMessageReaction(message, "emoji", callback);

删除消息回应

调用 removeMessageReaction (Android / iOS & Mac/ Windows) 接口删除消息回应。
删除消息回应接口入参详解如下:
属性
含义
说明
message
消息对象
消息必须是发送成功的状态。
reactionID
消息回应 ID
在表情回应场景,reactionID 为表情 ID。
说明
如果 Reaction 不存在,调用接口会报 ERR_SVR_MSG_REACTION_NOT_EXISTS 错误。
如果 Reaction 不包含当前用户,调用接口会报 ERR_SVR_MSG_REACTION_NOT_CONTAIN_USER 错误。
示例代码如下:
Android
iOS & Mac
Windows
V2TIMManager.getMessageManager().removeMessageReaction(message, "emoji", new V2TIMCallback() {
    @Override
    public void onSuccess() {
// remove message reaction succ
    }
    @Override
    public void onError(int code, String desc) {
// remove message reaction failed
}
});
[[V2TIMManager sharedInstance] removeMessageReaction:message reactionID:@"emoji" succ:^{
    // remove message reaction succ
} fail:^(int code, NSString *desc) {
    // remove message reaction failed
}];
class Callback final : public V2TIMCallback {
public:
    using SuccessCallback = std::function<void()>;
    using ErrorCallback = std::function<void(int, const V2TIMString &)>;
    Callback() = default;
    ~Callback() override = default;
    void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
        success_callback_ = std::move(success_callback);
        error_callback_ = std::move(error_callback);
    }
    void OnSuccess() override {
        if (success_callback_) {
            success_callback_();
        }
    }
    void OnError(int error_code, const V2TIMString &error_message) override {
        if (error_callback_) {
            error_callback_(error_code, error_message);
        }
    }
private:
    SuccessCallback success_callback_;
    ErrorCallback error_callback_;
};

auto *callback = new Callback{};
callback->SetCallback(
    [=]() {
        // remove message reaction succ
        delete callback;
    },
    [=](int error_code, const V2TIMString &error_message) {
        // remove message reaction failed
        delete callback;
    });
V2TIMManager::GetInstance()->GetMessageManager()->RemoveMessageReaction(message, "emoji", callback);

批量拉取多条消息回应信息

调用getMessageReactions (Android / iOS & Mac/ Windows) 接口批量拉取多条消息回应信息。
批量拉取多条消息回应信息接口入参详解如下:
属性
含义
说明
messageList
消息列表
消息必须属于同一个会话,消息必须是发送成功的状态。
maxUserCountPerReaction
每个 Reaction 返回的最大用户资料数量
取值范围【0,10】,每个 Reaction 最多只返回前 10 个用户资料,如需更多用户资料,
可以按需调用 getAllUserListOfMessageReaction 接口分页拉取。
拉取消息回应信息结果V2TIMMessageReactionResult 对象详解如下:
属性
含义
说明
resultCode
返回码
0:表示成功。
非0:表示失败。
resultInfo
返回信息
错误信息。
msgID
消息 ID
消息唯一 ID。
reactionList
消息回应列表
消息回应 V2TIMMessageReaction 对象列表。
其中V2TIMMessageReaction 对象详解如下:
属性
含义
说明
reactionID
消息回应 ID
在表情回应场景,reactionID 为表情 ID。
totalUserCount
总的用户个数
使用同一个 reactionID 回应消息的总的用户个数。
partialUserList
部分用户列表
使用同一个 reactionID 回应消息的部分用户列表,用户列表数量取决于调用
getMessageReactions 接口时设置的 maxUserCountPerReaction 值。
reactedByMyself
自己是否使用了该 reaction
如果自己使用了该 reaction,该字段会返回 true。
示例代码如下:
Android
iOS & Mac
Windows
V2TIMManager.getMessageManager().getMessageReactions(msgList, 5,
new V2TIMValueCallback<List<V2TIMMessageReactionResult>>() {
@Override
    public void onSuccess(List<V2TIMMessageReactionResult> v2TIMMessageReactionResults) {
        // get message reactions succ
for (V2TIMMessageReactionResult reactionResult : v2TIMMessageReactionResults) {
int resultCode = reactionResult.getResultCode();
String resultInfo = reactionResult.getResultInfo();
List<V2TIMMessageReaction> reactionList = reactionResult.getReactionList();
for (V2TIMMessageReaction reaction : reactionList) {
String reactionID = reaction.getReactionID();
int totalUserCount = reaction.getTotalUserCount();
List<V2TIMUserInfo> partialUserList = reaction.getPartialUserList();
}
}
    }
    @Override
    public void onError(int code, String desc) {
        // get message reactions failed
    }
});
[[V2TIMManager sharedInstance] getMessageReactions:msgList maxUserCountPerReaction:5
succ:^(NSArray<V2TIMMessageReactionResult *> *resultList) {
    // get message reactions succ
for (V2TIMMessageReactionResult *result in resultList) {
        int32_t resultCode = result.resultCode;
        NSString *resultInfo = result.resultInfo;
        NSArray *reactionList = result.reactionList;
        for (V2TIMMessageReaction *reaction in reactionList) {
            NSString *reactionID = reaction.reactionID;
            uint32_t totalUserCount = reaction.totalUserCount;
            NSArray *partialUserList = reaction.partialUserList;
        }
    }
} fail:^(int code, NSString *desc) {
    // get message reactions failed
}];
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
    using SuccessCallback = std::function<void(const T &)>;
    using ErrorCallback = std::function<void(int, const V2TIMString &)>;
    ValueCallback() = defalt;
    ~ValueCallback() override = default;
    void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
        success_callback_ = std::move(success_callback);
        error_callback_ = std::move(error_callback);
    }
    void OnSuccess(const T &value) override {
        if (success_callback_) {
            success_callback_(value);
        }
    }
    void OnError(int error_code, const V2TIMString &error_message) override {
        if (error_callback_) {
            error_callback_(error_code, error_message);
        }
    }
private:
    SuccessCallback success_callback_;
    ErrorCallback error_callback_;
};

auto *callback = new ValueCallback<V2TIMMessageReactionResultVector>{};
callback->SetCallback(
    [=](const V2TIMMessageReactionResultVector &messageReactionResultList) {
        // get message reactions succ
        delete callback;
    },
    [=](int error_code, const V2TIMString &error_message) {
        // get message reactions failed
        delete callback;
    });
V2TIMMessageVector message_list;
message_list.PushBack(message);
V2TIMManager::GetInstance()->GetMessageManager()->GetMessageReactions(message_list, 5, callback);

分页拉取全量消息回应用户列表

调用getAllUserListOfMessageReaction (Android / iOS & Mac / Windows) 接口分页拉取全量消息回应用户列表。
分页拉取全量消息回应用户列表接口入参详解如下:
属性
含义
说明
message
消息对象
消息必须是发送成功的状态。
reactionID
消息回应 ID
在表情回应场景,reactionID 为表情 ID。
nextSeq
分页拉取的游标
第一次传 0,后续分页传 succ 返回的 nextSeq。
count
一次分页最大拉取个数
最大支持 100 个
示例代码如下:
Android
iOS & Mac
Windows
int nextSeq = 0;
int count = 100;
V2TIMManager.getMessageManager().getAllUserListOfMessageReaction(message, "emoji", nextSeq, count,
new V2TIMValueCallback<V2TIMMessageReactionUserResult>() {
    @Override
    public void onSuccess(V2TIMMessageReactionUserResult v2TIMMessageReactionUserResult) {
// get all user list of message reaction succ
// nextSeq:next pull sequence
    }
    @Override
    public void onError(int code, String desc) {
        // get all user list of message reaction failed
    }
});
uint32_t nextSeq = 0;
uint32_t count = 100;
[[V2TIMManager sharedInstance] getAllUserListOfMessageReaction:message reactionID:@"emoji" nextSeq:nextSeq count:count
succ:^(NSArray<V2TIMUserInfo *> *userList, uint32_t nextSeq, BOOL isFinished) {
    // get all user list of message reaction succ
// nextSeq:next pull sequence
} fail:^(int code, NSString *desc) {
    // get all user list of message reaction failed
}];
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
    using SuccessCallback = std::function<void(const T &)>;
    using ErrorCallback = std::function<void(int, const V2TIMString &)>;
    ValueCallback() = defalt;
    ~ValueCallback() override = default;
    void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
        success_callback_ = std::move(success_callback);
        error_callback_ = std::move(error_callback);
    }
    void OnSuccess(const T &value) override {
        if (success_callback_) {
            success_callback_(value);
        }
    }
    void OnError(int error_code, const V2TIMString &error_message) override {
        if (error_callback_) {
            error_callback_(error_code, error_message);
        }
    }
private:
    SuccessCallback success_callback_;
    ErrorCallback error_callback_;
};

auto *callback = new ValueCallback<V2TIMMessageReactionUserResult>{};
callback->SetCallback(
    [=](const V2TIMMessageReactionUserResult &messageReactionUserResult) {
        // get all user list of message reaction succ
        delete callback;
    },
    [=](int error_code, const V2TIMString &error_message) {
        // get all user list of message reaction failed
        delete callback;
    });
V2TIMManager::GetInstance()->GetMessageManager()->GetAllUserListOfMessageReaction(message, "emoji", 0, 100, callback);

消息回应信息更新

如果您事先调用addAdvancedMsgListener添加了高级消息事件监听器,当消息回应信息发生了更新,您会收onRecvMessageReactionsChanged (Android / iOS & Mac / Windows) 回调。
需要注意的是该回调是消息 Reaction 的增量回调,只会携带变更的 Reaction 信息。当变更的 Reaction 信息里的totalUserCount字段值为0时,表明该 Reaction 已经没有用户在使用,您可以在 UI 上移除该 Reaction 的展示。
示例代码如下:
Android
iOS & Mac
Windows
V2TIMManager.getMessageManager().addAdvancedMsgListener(new V2TIMAdvancedMsgListener() {
@Override
public void onRecvMessageReactionsChanged(List<V2TIMMessageReactionChangeInfo> changeInfos) {
// receive message reactions changed notify
String msgID = changeInfo.getMessageID();
// changed reaction list
List<V2TIMMessageReaction> reactionList = changeInfo.getReactionList();
}
});
[[V2TIMManager sharedInstance] addAdvancedMsgListener:self];
- (void)onRecvMessageReactionsChanged:(NSArray<V2TIMMessageReactionChangeInfo *> *)changeList {
    // receive message reactions changed notify
for (V2TIMMessageReactionChangeInfo *changeInfo in changeList) {
NSString *msgID = changeInfo.msgID;
// changed reaction list
NSArray *reactionList = changeInfo.reactionList;
}
}
V2TIMManager::GetInstance()->GetMessageManager()->AddAdvancedMsgListener(this);
void OnRecvMessageReactionsChanged(const V2TIMMessageReactionChangeInfoVector &changeInfos) override {
     // receive message reactions changed notify
for (size_t i = 0; i < changeInfos.Size(); i++) {
         V2TIMMessageReactionChangeInfo reactionChangeInfo = changeInfos[i];
V2TIMString msgID = reactionChangeInfo.msgID;
// changed reaction list
         V2TIMMessageReactionVector reactionList = reactionChangeInfo.reactionList;
     }
 }