即时通信 IM Android&iOS&Windows&Mac(消息扩展)

消息扩展可以为消息增加 key/value 状态标识。基于消息扩展,我们可以实现投票、接龙、问卷调查等功能。

相关产品
即时通信 IM 产品页,含版本规格、价格与购买入口。

一、功能描述

·在投票场景,我们可以先通过 createCustomMessage (Java / Swift / Objective-C / C++) 接口创建一条用于投票的自定义消息,其中 data 存储投票的标题和选项,然后用消息扩展 key 存储投票用户 ID,用消息扩展 value 存储投票用户选项,有了每个用户的投票选项,我们就可以动态计算出投票选项的用户占比。

·在接龙场景,我们可以先通过 createCustomMessage 接口创建一条用于接龙的自定义消息,其中 data 存储接龙的标题,然后用消息扩展 key 存储接龙用户 ID,用消息扩展 value 存储接龙信息。

·在问卷调查场景,我们可以先通过 createCustomMessage 接口创建一条用于问卷调查的自定义消息,其中 data 存储问卷调查的标题和选项,然后用消息扩展 key 存储问卷调查的用户 ID,用消息扩展 value 存储问卷调查信息。

注意:说明:

二、设置消息扩展

调用 setMessageExtensions (Java / Swift / Objective-C / C++) 接口可以设置消息扩展,如果扩展 key 已经存在,则修改扩展的 value 信息,如果扩展 key 不存在,则新增扩展。

设置消息扩展接口入参详解如下:

属性 含义 说明
message 消息对象 消息需满足三个条件:消息发送前需设置 supportMessageExtension (Java / Swift / Objective-C / C++) 为 YES。消息必须是发送成功的状态。消息不能是直播群(AVChatRoom)消息。
extensions 扩展列表 如果扩展 key 已经存在,则修改扩展的 value 信息,如果扩展 key 不存在,则新增扩展。

注意:说明:

注意:1. 扩展 key 最大支持 100 字节,扩展 value 最大支持 1KB,单次最多支持设置 20 个扩展,单条消息最多可设置 300 个扩展。

注意:2. 当多个用户同时设置或删除同一个扩展 key 时,只有第一个用户可以执行成功,其它用户会在设置回包收到 23001 错误码和最新的扩展信息,在收到错误码和扩展信息后,请按需重新发起设置操作。

注意:3. 我们强烈建议不同的用户设置不同的扩展 key,这样大部分场景都不会冲突,例如投票、接龙、问卷调查,都可以把自己的 userID 作为扩展 key。

示例代码如下:

JavaSwiftObjective-CC++List<V2TIMMessageExtension> extensionList = new ArrayList<>();V2TIMMessageExtension extension1 = new V2TIMMessageExtension();extension1.setExtensionKey("key1");extension1.setExtensionValue("value1");extensionList.add(extension1);V2TIMMessageExtension extension2 = new V2TIMMessageExtension();extension2.setExtensionKey("key2");extension2.setExtensionValue("value2");extensionList.add(extension2);V2TIMManager.getMessageManager().setMessageExtensions(lastMsg, extensionList, new V2TIMValueCallback<List<V2TIMMessageExtensionResult>>() { @Override public void onSuccess(List<V2TIMMessageExtensionResult> v2TIMMessageExtensionResults) { // 设置消息扩展成功 } @Override public void onError(int code, String desc) { // 设置消息扩展失败 }});if let msg = sendedMsgList.first { var exts = [V2TIMMessageExtension]() exts.append({ let ext = V2TIMMessageExtension() ext.extensionKey = "swift key1" ext.extensionValue = "swift value1" return ext }()) exts.append({ let ext = V2TIMMessageExtension() ext.extensionKey = "swift key2" ext.extensionValue = "swift value2" return ext }()) V2TIMManager.shared.setMessageExtensions(message: msg, extensions: exts) { extensionResultList in extensionResultList.forEach { item in let ext = item.ext let k = ext?.extensionKey let value = item.ext?.extensionValue print("\\(k),\\(value)") } } fail: { code, desc in print("setMessageExtensions fail, \\(code), \\(desc)") }}NSMutableArray *extensionList = [NSMutableArray array];V2TIMMessageExtension *extension1 = [[V2TIMMessageExtension alloc] init];extension1.extensionKey = @"key1";extension1.extensionValue = @"value1";[extensionList addObject:extension1];V2TIMMessageExtension *extension2 = [[V2TIMMessageExtension alloc] init];extension2.extensionKey = @"key2";extension2.extensionValue = @"value2";[extensionList addObject:extension2];[[V2TIMManager sharedInstance] setMessageExtensions:message extensions:extensionList succ:^(NSArray<V2TIMMessageExtensionResult *> *extensionResultList) { // 设置消息扩展成功} fail:^(int code, NSString *desc) { // 设置消息扩展失败}];class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T &)>; using ErrorCallback = std::function<void(int, const V2TIMString &)>; ValueCallback() = default; ~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_;};V2TIMMessageExtensionVector extensionList;V2TIMMessageExtension extension1;extension1.extensionKey = "key1";extension1.extensionValue = "value1";extensionList.PushBack(extension1);V2TIMMessageExtension extension2;extension2.extensionKey = "key2";extension2.extensionValue = "value2";extensionList.PushBack(extension2);auto *callback = new ValueCallback<V2TIMMessageExtensionResultVector>{};callback->SetCallback( [=](const V2TIMMessageExtensionResultVector &extensionResultList) { // 设置消息扩展成功 delete callback; }, [=](int error_code, const V2TIMString &error_message) { // 设置消息扩展失败 delete callback; });V2TIMManager::GetInstance()->GetMessageManager()->SetMessageExtensions(message, extensionList, callback);

三、获取消息扩展

调用 getMessageExtensions (Java / Swift / Objective-C / C++) 接口获取消息扩展列表。

注意:说明:

注意:如果没有网络,SDK 会直接返回本地缓存的消息扩展列表。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getMessageManager().getMessageExtensions(lastMsg, new V2TIMValueCallback<List<V2TIMMessageExtension>>() { @Override public void onSuccess(List<V2TIMMessageExtension> extensions) { // 获取消息扩展成功 } @Override public void onError(int code, String desc) { // 获取消息扩展失败 }});if let msg = sendedMsgList.first { V2TIMManager.shared.getMessageExtensions(message: msg) { extensionList in extensionList.forEach { item in print(item.description) } } fail: { code, desc in print("getMessageExtensions fail, \\(code), \\(desc)") }}[[V2TIMManager sharedInstance] getMessageExtensions:message succ:^(NSArray<V2TIMMessageExtension *> *extensionList) { // 获取消息扩展成功} fail:^(int code, NSString *desc) { // 获取消息扩展失败}];class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T &)>; using ErrorCallback = std::function<void(int, const V2TIMString &)>; ValueCallback() = default; ~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<V2TIMMessageExtensionVector>{};callback->SetCallback( [=](const V2TIMMessageExtensionVector &extensionList) { // 获取消息扩展成功 delete callback; }, [=](int error_code, const V2TIMString &error_message) { // 获取消息扩展失败 delete callback; });V2TIMManager::GetInstance()->GetMessageManager()->GetMessageExtensions(message, callback);

调用 deleteMessageExtensions (Java / Swift / Objective-C / C++) 接口删除指定消息扩展,如果 keys 字段填 null/nil ,则会清空所有消息扩展。

示例代码如下:

JavaSwiftObjective-CC++List<String> keyList = new ArrayList<>();keyList.add("key1");keyList.add("key2");V2TIMManager.getMessageManager().deleteMessageExtensions(lastMsg, keyList, new V2TIMValueCallback<List<V2TIMMessageExtensionResult>>() { @Override public void onSuccess(List<V2TIMMessageExtensionResult> v2TIMMessageExtensionResults) { // 删除消息扩展成功 } @Override public void onError(int code, String desc) { // 删除消息扩展失败 }});if let msg = sendedMsgList.first { V2TIMManager.shared.deleteMessageExtensions(message: msg, keys: ["key1", "key2"]) { extensionResultList in extensionResultList.forEach { item in print(item.description) } } fail: { code, desc in print("getMessageExtensions fail, \\(code), \\(desc)") }}[[V2TIMManager sharedInstance] deleteMessageExtensions:message keys:@[@"key1",@"key2"] succ:^(NSArray<V2TIMMessageExtensionResult *> *extensionResultList){ // 删除消息扩展成功} fail:^(int code, NSString *desc) { // 删除消息扩展失败}];class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T &)>; using ErrorCallback = std::function<void(int, const V2TIMString &)>; ValueCallback() = default; ~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_;};V2TIMStringVector keys;keys.PushBack("key1");keys.PushBack("key2");auto *callback = new ValueCallback<V2TIMMessageExtensionResultVector>{};callback->SetCallback( [=](const V2TIMMessageExtensionResultVector &extensionResultList) { // 删除消息扩展成功 delete callback; }, [=](int error_code, const V2TIMString &error_message) { // 删除消息扩展失败 delete callback; });V2TIMManager::GetInstance()->GetMessageManager()->DeleteMessageExtensions(message, keys, callback);

四、消息扩展更新

如果你事先调用 addAdvancedMsgListener 添加了高级消息事件监听器,当消息扩展发生了新增或者更新,你会收到 onRecvMessageExtensionsChanged (Java / Swift / Objective-C / C++) 回调,当消息扩展发生了删除,你会收到 onRecvMessageExtensionsDeleted (Java / Swift / Objective-C / C++) 回调。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getMessageManager().addAdvancedMsgListener(new V2TIMAdvancedMsgListener() { @Override public void onRecvMessageExtensionsChanged(String msgID, List<V2TIMMessageExtension> extensions) { // 收到消息扩展变更通知 } @Override public void onRecvMessageExtensionsDeleted(String msgID, List<String> extensionKeys) { // 收到消息扩展删除通知 }});V2TIMManager.shared.addAdvancedMsgListener(listener: self)func onRecvMessageExtensionsChanged(msgID: String, extensions: Array<V2TIMMessageExtension>) { extensions.forEach { item in print(item.description) }}func onRecvMessageReactionsChanged(changeList: Array<V2TIMMessageReactionChangeInfo>) { changeList.forEach { item in print(item.description) }}[[V2TIMManager sharedInstance] addAdvancedMsgListener:self];- (void)onRecvMessageExtensionsChanged:(NSString *)msgID extensions:(NSArray<V2TIMMessageExtension *> *)extensions { // 收到消息扩展变更通知}- (void)onRecvMessageExtensionsDeleted:(NSString *)msgID extensionKeys:(NSArray<NSString *> *)extensionKeys { // 收到消息扩展删除通知}class AdvancedMsgListener final : public V2TIMAdvancedMsgListener {public: void OnRecvMessageExtensionsChanged(const V2TIMString &msgID, const V2TIMMessageExtensionVector &extensions) override { // 收到消息扩展变更通知 } void OnRecvMessageExtensionsDeleted(const V2TIMString &msgID, const V2TIMStringVector &extensionKeys) override { // 收到消息扩展删除通知 } // 其他成员 …};// 添加高级消息的事件监听器,注意在移除监听器之前需要保持 advancedMsgListener 的生命期,以免接收不到事件回调AdvancedMsgListener advancedMsgListener;V2TIMManager::GetInstance()->GetMessageManager()->AddAdvancedMsgListener(&advancedMsgListener);

赞 (0)
上一篇 4天前
下一篇 4天前